Java 正则表达式 find() 方法没有返回正确的值

Java Regex find() method not returning proper value

我在 Java 中创建了一个正则表达式模式,显然,匹配器 class 在字符串中找到了它,但它没有返回正确的值。

如果您看到这个 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 位服务器。

我是 Whosebug、Java 和 Eclipse 的新手。

查看您的屏幕截图,其中显示 m.find()true 并且分配给 isMatch 变量的相同值是 false,这意味着两者不同步,我能想到的唯一原因是,因为你处于调试模式并且因为你在表达式 window 中有它们,m.find() 似乎被执行了多次,其中 [ 的第一个时间值=12=] 一定是真的,但是当它再次执行时,下次它与数据不匹配并且 m.find()'s 值变成 false 并且最终被分配给 isMatch 变量.

尝试摆脱调试模式,只是 运行 代码和变量 isMatch 的值应该同步并且应该符合预期。或者您甚至可以在调试代码时关闭表达式 window,并且调试应该会按预期为您提供正确的值。确保您没有重新评估 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_