【问题标题】:Java Regex find() method not returning proper valueJava Regex find() 方法没有返回正确的值
【发布时间】:2019-04-10 10:48:20
【问题描述】:

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

如果你看到这个image,当我执行m.find() 方法时,Eclipse 给了我一个“真”值,但它没有正确地将它分配给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() 是“真”(正如 Eclipse 向我展示的那样),但它永远不会进入内部 if 块,如果我尝试分配给另一个布尔值也不会。

https://regex101.com/ 中测试并获得价值。

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

我是 StackOverflow、Java 和 Eclipse 的新手。

【问题讨论】:

  • 请删除您的 Eclipse 屏幕截图链接,并直接在问题中包含所有相关的 Java 代码。
  • 在问题中添加代码而不是图像
  • 如果您使用if (m.find()) { ... } 之前没有调用.find(),如果您的正则表达式匹配字符串,它必须工作。
  • 你会在图像中看到更好,但我把代码放在了

标签: java regex matcher


【解决方案1】:

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

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

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

对我来说,您的代码可以正常工作并打印出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_

【讨论】:

  • 即使在同步方法中也会发生吗?
  • 同步方法在这里无关紧要,因为您处理的所有变量都是方法中的本地变量。此外,重新评估不需要其他线程再次调用整个方法,因此在保持方法同步的同时,您可以根据需要多次重新评估表达式。
  • 感谢先生。问题似乎正如您所指出的那样:“意味着两者不同步,我能想到的唯一原因是,因为您处于调试模式并且因为您将它们放在表达式窗口中,所以 m.find() 似乎越来越执行了多次,”...我很生气,想知道什么不起作用。
  • 是的,我知道有时会发生这种情况,这有点令人沮丧:) 很高兴我能够澄清这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多