我使用以下代码:
Pattern p = Pattern.compile("^\\+?[1-9]\\d{1,14}$");
stringNumber=stringNumber.replace(" ","");
Matcher m = p.matcher(stringNumber);
if (!m.matches())
{
[...]
}
应该正确检测E.164格式的数字的模式并不像我认为的那样有效,因为它可以作为E.164电话号码有效,一个数字在格式为XXXXXXXXX,X为0到9之间的所有数字。尽管我看到模式但我不明白为什么。
限制较少的模式" ^ \ +?\ d {10,14} $"确实有效,因为它检测到许多XXXXXXXXX不适合该格式。
也许最后一个模式足以满足我的应用目的,但我想使用第一个模式(可以确定电话号码在每种情况下都是E.164格式)只是为了获得更广泛的即使这些可能性很少,也会有各种可能性。
第一种模式可能导致意外行为的原因是什么?
答案 0 :(得分:4)
要使数字前面有+
,您的正则表达式应为^\\+[1-9]\\d{1,14}$
。请注意删除?
,这意味着+
是可选的。
此外,第二个模式与输入不匹配的原因不是因为+
,而是因为第二个模式至少需要一个10位数,而你的例子是9位数。