【问题标题】:Java Pattern Matcher is not working for regex as expectedJava 模式匹配器无法按预期用于正则表达式
【发布时间】:2016-11-23 21:35:44
【问题描述】:
1)  Pattern pattern = Pattern.compile("34238");
   Matcher matcher = pattern.matcher("6003 Honore Ave Suite 101 Sarasota Florida,
   34238");
    if (matcher.find()) {
        System.out.println("ok");
    }

2)  Pattern pattern = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$");
    Matcher matcher = pattern.matcher("34238");
    if (matcher.find()) {
        System.out.println("ok");
    }

上述代码的输出是:ok

但是下面的代码没有打印任何东西:

    Pattern pattern = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$");
    Matcher matcher = pattern.matcher("6003 Honore Ave Suite 101 Sarasota Florida, 34238");
    if (matcher.find()) {
        System.out.println("ok");
    }

不打印ok的原因是什么?我在这里也使用相同的模式。

【问题讨论】:

  • 为什么不使用"6003 Honore Ave Suite 101 Sarasota Florida, 34238".contains("34238")
  • 这是美国邮政编码格式。我们不确定是否会得到相同的结果
  • 最后我必须找到那句话有没有美国邮政编码的天气
  • 这两个块中哪一个产生ok?
  • 第一和第二块

标签: java regex pattern-matching matcher


【解决方案1】:

虽然模式相同,但输入的字符串不同:

  • 在第二个示例中,您要匹配一个完全由邮政编码组成的字符串,因此您会得到 ^...$ 表达式的匹配项
  • 第二个示例不以邮政编码开头,因此^ 锚点会阻止您的正则表达式匹配。

^$ 锚点用于当您希望表达式匹配整个输入行时。开头要匹配时,保留^,去掉$;当你想最后匹配时,删除^并保留$;当您想匹配字符串中的任何位置时,请删除两个锚点。

【讨论】:

    【解决方案2】:

    代码很好,可以按预期工作。在您问题的2)3) 块中,您使用的是相同的正则表达式,但输入字符串不同。

    但是,如果您只想检查字符串是否必须包含美国邮政编码,那么问题在于您的正则表达式使用了锚点,因此您只匹配以邮政编码开头和结尾的行。

    与您的正则表达式匹配的字符串类似于3423834238-1234,不会匹配something 12345 something

    如果你删除锚点,那么你将匹配whatever 12345 whatever

    // Pattern pattern = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$");
    //                                    ^--------- Here -------^
    Pattern pattern = Pattern.compile("[0-9]{5}(?:-[0-9]{4})?");
    Matcher matcher = pattern.matcher("6003 Honore Ave Suite 101 Sarasota Florida, 34238");
    if (matcher.find()) {
        System.out.println("ok");
    }
    

    顺便说一句,如果你只是想检查一个字符串是否包含邮政编码,那么你可以使用String.matches(..),像这样:

    String str = "6003 Honore Ave Suite 101 Sarasota Florida, 34238";
    if (str.matches(".*[0-9]{5}(?:-[0-9]{4})?.*")) {
        System.out.println("ok");
    }
    

    IDEOne demo

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2016-11-03
      相关资源
      最近更新 更多