Java Pattern Matcher不能按预期使用正则表达式

时间:2016-07-20 15:33:06

标签: java regex pattern-matching matcher

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");
    }

上述代码的输出为:确定

但以下代码不打印任何内容:

    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");
    }

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

  • 在您的第二个示例中,您匹配的是一个完全由邮政编码组成的字符串,因此您可以获得^...$表达式的匹配
  • 第二个示例不是以邮政编码开头,因此^锚点会阻止您的正则表达式匹配。
当您希望表达式与整个输入行匹配时,将使用

^$个锚点。如果您想在开头匹配,请保留^并移除$;如果您想在最后匹配,请移除^并保留$;当你想匹配字符串中的任何地方时,删除两个锚点。