有没有更好的方法来表示正则表达式中固定数量的重复?例如,如果我只想精确匹配14个字母/数字,我使用^\w\w\w\w\w\w\w\w\w\w\w\w\w\w$,它将匹配像UNL075BE499135这样的单词,而不匹配UNL075BE499135AAA。有没有方便的方法来做到这一点?我目前正在Java中做这一点,但我猜这可能也适用于其他语言。
^\w\w\w\w\w\w\w\w\w\w\w\w\w\w$
UNL075BE499135
UNL075BE499135AAA
xienkqul1#
对于Java:Quantifiers documentationX,正好n次:X{n}X,至少n次:X{n,}X,至少n次但不超过m次:X{n,m}
cigdeys32#
有限重复语法使用{m,n}代替星号/加号/问号。从java.util.regex.Pattern开始:
{m,n}
java.util.regex.Pattern
X{n} X, exactly n times X{n,} X, at least n times X{n,m} X, at least n but not more than m times
所有重复元字符具有相同的优先级,因此就像您可能需要对*、+和?进行分组一样,您也可以对{n,m}进行分组。
*
+
?
{n,m}
ha*
"haaaaaaaa"
ha{3}
"haaa"
(ha)*
"hahahahaha"
(ha){3}
"hahaha"
同样,就像*、+和?一样,你可以分别添加?和+勉强和所有格重复修饰语。
System.out.println( "xxxxx".replaceAll("x{2,3}", "[x]") ); "[x][x]" System.out.println( "xxxxx".replaceAll("x{2,3}?", "[x]") ); "[x][x]x"
基本上,只要*是"zero-or-more"的重复元字符,就可以使用{...}重复构造。注意,反过来就不对了:可以在lookbehind中使用有限重复,但不能使用*,因为Java不正式支持无限长lookbehind。
{...}
.*
.*?
regex{n,}?
regex{n}
a{1}b{0,1}
ab?
zpgglvta3#
^\w{14}$以及任何Perl风格的正则表达式。如果你想学习更多关于正则表达式的知识--或者只是需要一个方便的参考资料--Wikipedia Entry on Regular Expressions实际上是相当不错的。
^\w{14}$
3df52oht4#
在Java中,使用Pattern p = Pattern.compile("^\\w{14}$");创建模式以获取更多信息see the javadoc
Pattern p = Pattern.compile("^\\w{14}$");
4条答案
按热度按时间xienkqul1#
对于Java:
Quantifiers documentation
X,正好n次:X{n}
X,至少n次:X{n,}
X,至少n次但不超过m次:X{n,m}
cigdeys32#
有限重复语法使用
{m,n}
代替星号/加号/问号。从
java.util.regex.Pattern
开始:所有重复元字符具有相同的优先级,因此就像您可能需要对
*
、+
和?
进行分组一样,您也可以对{n,m}
进行分组。ha*
匹配,例如"haaaaaaaa"
ha{3}
仅与"haaa"
匹配(ha)*
匹配,例如"hahahahaha"
(ha){3}
仅与"hahaha"
匹配同样,就像
*
、+
和?
一样,你可以分别添加?
和+
勉强和所有格重复修饰语。基本上,只要
*
是"zero-or-more"的重复元字符,就可以使用{...}
重复构造。注意,反过来就不对了:可以在lookbehind中使用有限重复,但不能使用*
,因为Java不正式支持无限长lookbehind。参考文献
相关问题
.*
和.*?
之间的差异regex{n,}?
==regex{n}
?a{1}b{0,1}
而不是ab?
的习惯zpgglvta3#
^\w{14}$
以及任何Perl风格的正则表达式。如果你想学习更多关于正则表达式的知识--或者只是需要一个方便的参考资料--Wikipedia Entry on Regular Expressions实际上是相当不错的。
3df52oht4#
在Java中,使用
Pattern p = Pattern.compile("^\\w{14}$");
创建模式以获取更多信息see the javadoc