在模式中查找RegEx子模式



我正在尝试从电话号码中删除+1(国家/地区代码)(我正在进行一个规范化项目)。例如,用户有一个格式为+1(703)-555-5787的电话号码,他希望它是(703"-555-5787(前面没有+1)。

我的理论是,我可以根据正则表达式模式搜索phoneNum字符串。一旦找到它,我就可以打印它或做任何我喜欢的事情。我的代码如下:

public static String normalizePrefix(final String phoneNum) {
    String ret = phoneNum;
    if (!phoneNum.contains("+1")) {
        logger.log(Level.INFO, "input phone number doesn't contain country code (+1)");
    }
    else {          
        String regex = "(\+1)([2-9][0-9][0-9])-([2-9][0-9]{2})-([0-9]{4})";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(phoneNum); 

            if (phoneNum.matches(regex)){
                ret = m.group().substring(2, m.end());
            }
    }
    logger.log(Level.INFO, phoneNum + "-->" + ret);
    return ret;
}

我错过了什么?

matches将尝试与模式完全匹配。。

因此,如果字符串之间有电话号码,则正则表达式将不起作用。

使用Matcher的查找方法

 if (m.find())
 {
      ret = m.group().substring(2, m.group().length());
 }

尝试regex:

String regex = "\([0-9]{3}\)-[0-9]{3}-[0-9]{4}";

并将if块修改为:

if (m.find()){
            ret = m.group(0);
}

我在这里尝试并测试了以下正则表达式:

String regex = "\([0-9]{3}\)-[0-9]{3}-[0-9]{4}";

之后,修改if块:

if (m.matches()){
    ret = m.group(2);
}

这应该始终返回电话号码,无论是否有+1前缀。

所以,我想明白了(我在问了大约20分钟后试图回答我的问题,但So不让我回答)。尽管如此,感谢大家的反馈和支持,我真的很感激。

这是我的错误:

我的正则表达式是String regex = "(\+1)([2-9][0-9][0-9])-([2-9][0-9]{2})-([0-9]{4})";,但phoneNum字符串是+1(703)-555-4563。它给了我错误,因为regex正在寻找这种格式的数字:+1703-555-4563(区号周围没有())。因此,不可能找到子字符串,因为它不存在。我的正则表达式应该是String regex = "(\+1)(\([2-9][0-9][0-9]\))-([2-9][0-9]{2})-([0-9]{4})";

感谢大家的帮助!

非常感谢:)

最新更新