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}]*

这是什么意思[++]*+

这是否意味着“加或加零次或多次然后加?

将两个加号放在一起有意义吗?

4

5 回答 5

3

[++]匹配一个+或一个+

*+匹配[++]零次或多次,所有格

见:http ://www.regular-expressions.info/possessive.html

于 2013-08-14T13:42:23.543 回答
2

最右边+的是相当新的。正如其他人所说,[++]意思是“找单+”。带*量词:[++]*表示“零个或多个加号”。

不是所有的正则表达式引擎都支持额外的最右边+[++]*+但意味着“不做任何回溯”,即做一个“最大匹配”。与 进行对比?,它进行最小匹配。

另请参阅此问题

于 2013-08-14T13:42:42.070 回答
2

+在字符类中被视为文字..应该是[+]*+

*+是所有格量词..它不会回溯..

于 2013-08-14T13:43:42.023 回答
1
  1. 是的

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

于 2013-08-14T13:36:38.953 回答
0

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

在字符类[++]中,它只是被忽略了。在字符类之外,它充当量词(一个或多个),但无效,因为除非前面有另一个量词,例如*此处(零或多个),否则它表示占有性

更多信息在所有格量词

您可以通过在其后放置一个额外的 + 来使量词具有所有格。例如 * 是贪婪的,*? 是懒惰的, *+ 是所有格。++、?+ 和 {n,m}+ 也是所有格。

于 2013-08-14T13:40:10.133 回答