Java Regex find()方法未返回正确的值

时间:2019-04-10 10:48:20

标签: java regex matcher

我已经用Java创建了一个正则表达式模式,显然,匹配器类将其找到到字符串中,但是它没有返回正确的值。

如果看到此image,则当我执行m.find()方法时,Eclipse给我一个'true'值,但它没有正确地将其分配给isMatch变量。

当我写“ if (m.find())时也会发生同样的情况,它不会进入内部块。

代码示例:

{

    private final static String REGEX_PATTERN_FILE_GROUP = "(\\d{14}_\\d{9}_\\D{3}_\\d{11}_)";

    for (File file: fileList) {
        Pattern p = Pattern.compile(REGEX_PATTERN_FILE_GROUP);  
        Matcher m = p.matcher(file.getName());              
        if (m.find())
        {   
           .... More code ...
        }

}

file.getName()值的示例: “ 1.0- 20190409095211_200522007_CNA_20180000959_1_xxxxx.pdf”

显然,m.find()是'true'(就像Eclipse向我展示的那样),但是它永远不会进入if块内部,如果我尝试分配给另一个布尔值也不会。

https://regex101.com/中进行了测试,并获得了价值。

我的Java版本是“ 1.8.0_181” 64位服务器。

我是StackOverflow,Java和Eclipse的新手。

1 个答案:

答案 0 :(得分:0)

查看您的屏幕快照,其中将m.find()显示为true,并且将分配给isMatch变量的相同值显示为false,这意味着两者不同步,并且我能想到的唯一原因是,由于您处于调试模式,并且由于您将它们放在表达式窗口中,因此m.find()似乎正在执行多次,其中m.find()的第一个时间值必须具有确实如此,但是随着它再次执行,下一次它与数据不匹配,并且m.find()'s的值变成了false,并且最终被分配给了isMatch变量。

尝试摆脱调试模式,仅运行代码,变量isMatch的值应同步且应符合预期。或者甚至可以在调试代码时关闭表达式窗口,并且调试应该为您提供正确的值,如预期的那样。确保您不要重新评估m.find(),否则您的程序会给您带来意想不到的结果。

此外,除非.group()m.find()返回的值为m.matches(),否则永远不要访问true方法

对我来说,您的代码可以像预期的那样正常工作,并显示true

String REGEX_PATTERN_FILE_GROUP = "(\\d{14}_\\d{9}_\\D{3}_\\d{11}_)";

String s = "1.0- 20190409095211_200522007_CNA_20180000959_1_xxxxx.pdf";
Pattern p = Pattern.compile(REGEX_PATTERN_FILE_GROUP);
Matcher m = p.matcher(s);
boolean isMatch = m.find();
System.out.println("isMatch: " + isMatch);
if (isMatch) {
    System.out.println(m.group());
}

打印

isMatch: true
20190409095211_200522007_CNA_20180000959_