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