Java Regex:字符串文字中的单词边界匹配器

时间:2014-01-22 04:16:42

标签: java regex word-boundary

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代码表示该字符串与正则表达式不匹配。我在犯一些愚蠢的错误吗?有趣的是,如果我在Oracle Docs所示的cmd行(不是字符串文字)中输入正则表达式,那么它可以正常工作。

4 个答案:

答案 0 :(得分:5)

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

用Java来了解

是很方便的
  • find在字符串中的任何位置查找匹配项(并且可以迭代)
  • lookingAt在字符串
  • 的开头查找匹配项
  • matches希望匹配整个字符串

另见

答案 1 :(得分:1)

Matcher#matches()州的javadoc

  

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

所以它试图匹配整个abc dog def。它并不是要检查Pattern中是否显示String。请使用Matcher#find()

  

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

答案 2 :(得分:1)

问题在于使用matches而不是find。匹配期望整个字符串\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());
      }
   }
}

感谢您在帖子中发布工作代码,我可以剪切,粘贴,编译和运行,而不必乱用它,或找出丢失的部分。

答案 3 :(得分:0)

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

String text = "abc dog def";
if (text.matches(".*\\bdog\\b.*")) // true