我正在使用以下代码:
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格式),即使即使这些可能性很少。
第一种模式可能导致这种意外行为?
最佳答案
为了使数字在前面具有+
,您的正则表达式应为^\\+[1-9]\\d{1,14}$
。注意删除了?
,这意味着+
是可选的。
同样,第二个模式与输入不匹配的原因也不是因为+
而是因为第二个模式至少需要一个10位数字,并且您的示例使用了9位数字。