正则表达式中的 [++]*+ 代表什么?

3

我正在使用libphonenumber,并尝试使用正则表达式模式VALID_PHONE_NUMBER检查一些电话号码是否有效。该模式可以在这里找到,它的样子是这样的

private static final String VALID_PHONE_NUMBER =
      DIGITS + "{" + MIN_LENGTH_FOR_NSN + "}" + "|" +
      "[" + PLUS_CHARS + "]*+(?:[" + VALID_PUNCTUATION + STAR_SIGN + HASH_SIGN +"]*" + DIGITS + "){3,}[" +
      VALID_PUNCTUATION + STAR_SIGN + HASH_SIGN + VALID_ALPHA + DIGITS + "]*";

在我的Android手机上,这个表达式被编译成以下内容。
\p{Nd}{1}|[++]*+(?:[-x--?-?--/  ­?? ()()[].\[\]/~?~~*#]*\p{Nd}){3,}[-x--?-?--/  ­?? ()()[].\[\]/~?~~*#DEFGABCLMNOHIJKUTWVQPSRYXZdefgabclmnohijkutwvqpsryxz\p{Nd}]*

这句话的意思是什么:[++]*+

它的意思是“加加零次或多次,然后再加上”吗?

连续两个加号有什么意义吗?


这不是一个有效的正则表达式。 - SLaks
我查看了您提供的链接中的正则表达式,发现没有 [++]*+,但是有 [+]*+,因为您使用的是 Java,它是一种占有量词。 - Ibrahim Najjar
我看到了静态的final字符串PLUS_CHARS = "+\uFF0B"; 我相信它是++。 - Marian Paździoch
5个回答

3

2
右边的+是比较新的。正如其他人所说,[++]表示“查找一个加号”。带有*量词: [++]*表示“零个或多个加号”。 [++]*+中额外的右侧+并不被所有正则表达式引擎支持,但是它的意思是“不要进行任何回溯”,即进行“最大匹配”。与?相对应,后者进行最小匹配。
另请参见此问题

2
在字符类中,+被视为文字,应该写成[+]*+*+贪婪限定符,它不会回溯。

1

字符类([...])会忽略重复的字符。
因此,[++] 等同于 \+


4
我认为最后的 "+" 是一个所有格量词。 - johnchen902
在大多数流行的正则表达式实现中,*+ 中的 + 表示 * 是贪婪的:http://www.regular-expressions.info/possessive.html - Bart Kiers

0

第二个+在字符类内外都是多余的。

在字符类[++]中,它被忽略。在字符类外部,它作为量词(一个或多个)但不是有效的,因为除非在前面加上另一个量词,如此处的*(表示零个或多个),那么它表示占有性

更多信息请参见占有性量词

您可以通过在量词后面添加额外的+来使其具有占有性。例如,*是贪婪的,*?是懒惰的,*+是占有性的。++、?+和{n,m}+也都具有占有性。


2
我认为最后的+是一个所有格量词。 - johnchen902

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接