【问题标题】:Finding a RegEx subpattern within a pattern在模式中查找 RegEx 子模式
【发布时间】:2013-07-01 12:50:31
【问题描述】:

我正在尝试从电话号码中删除 +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;
}

我错过了什么?

【问题讨论】:

  • “我错过了什么?”我们不知道!你遇到什么问题?这怎么不完全有效?
  • 问题是a)它返回与前面+1相同的字符串,b)它没有进入封闭的if语句。

标签: java regex normalization


【解决方案1】:

matches 会尝试完全匹配..

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

使用 Matcher 的 find 方法

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

【讨论】:

  • 在此处使用m.end() 作为参数似乎是一个糟糕的选择,因为它与输入字符串相关,而不是与m.group() 的长度相关。不过,您使用 find() 的提示是正确的。
  • 您好 Anirudh,感谢您的回答!我只是用你的答案替换了我的代码,但它没有修复它,它做的事情和以前一样(返回前面带 +1 的原始字符串)。 @Anirudh
  • @misswarren 是正确的..替换的字符串存储在ret..您可能检查了错误的字符串或者您的正则表达式可能不正确..在这种情况下向我们展示有效的输入
【解决方案2】:

试试正则表达式:

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

并将 if 块修改为:

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

【讨论】:

    【解决方案3】:

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

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

    之后,修改 if 块:

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

    这应该总是返回电话号码,无论 +1 前缀是否存在。

    【讨论】:

      【解决方案4】:

      所以,我想通了(我试图在我提出问题大约 20 分钟后回答我的问题,但 SO 不允许我这样做)。尽管如此,还是感谢大家的反馈和支持,我真的很感激。

      这是我的错误:

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

      感谢大家的帮助!

      非常感谢:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 2013-05-05
        相关资源
        最近更新 更多