我正在使用以下代码:

    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位数字。

07-28 08:27