0

Java 代码:

import java.util.regex.*;

class Test {
    public static void main(String[] args) {
        String r = "\\bdog\\b";
        Pattern p = Pattern.compile(r);
        String text = "abc dog def";
        System.out.println(p.matcher(text).matches());
    } 
}

等效的 Perl 代码:

$x = "abc dog def";
if ($x =~ /\bdog\b/) {
    print "matches";
}

Perl 代码的行为符合预期,并打印出字符串“abc dog def”与给定的正则表达式匹配。另一方面,Java 代码表示该字符串与正则表达式不匹配。我犯了一些愚蠢的错误吗?有趣的是,如果我在 cmd 行(而不是字符串文字)上输入正则表达式,如Oracle Docs所示,那么它可以正常工作。

4

4 回答 4

5

不同之处在于matches,Java 中的意思是匹配整个字符串,而不是 Perl 中的一部分。就好像有一种隐含的^存在$

在 Java 中很容易知道,

  • find在字符串中的任何位置查找匹配项(并且可以迭代)
  • lookingAt在字符串的开头查找匹配项
  • matches想要匹配整个字符串

另见

于 2014-01-22T04:18:33.667 回答
1

Matcher#matches()状态的 javadoc

尝试将整个区域与模式匹配。

所以它试图匹配整个abc dog def. 它不是试图Pattern检查String. 为此使用Matcher#find()

尝试查找与模式匹配的输入序列的下一个子序列。

于 2014-01-22T04:18:49.740 回答
1

问题是使用matches而不是find. Matches 期望整个字符串匹配\bdog\b,但显然不是。

这就是你需要的:

import java.util.regex.*;

class Test {
   public static void main(String[] args) {
      String r = "\\bdog\\b";
      Pattern p = Pattern.compile(r);
      String text = "abc dog def";
      Matcher m = p.matcher(text);
      while(m.find())  {
         System.out.println(m.group());
      }
   }
}

感谢您在您的帖子中发布工作代码,我可以剪切、粘贴、编译和运行这些代码,而无需弄乱它,或者找出丢失的部分。

于 2014-01-22T04:22:12.067 回答
0

与大多数其他只需要匹配部分输入为真的语言不同,javamatches()必须匹配整个字符串,所以要从 perl 转换为 java,只需添加.*到正则表达式的每一端:

String text = "abc dog def";
if (text.matches(".*\\bdog\\b.*")) // true
于 2014-01-22T04:22:05.423 回答