边界Java正则表达式不起作用

时间:2015-01-22 08:10:00

标签: java regex boundary

你能否告诉我为什么这个表达不会返回TRUE

public class test  {

public static void main(String[] args) throws IOException{

    String str = "The dog plays";
    boolean t = str.matches("\\bdog\\b");

    System.out.println(t);

  }
}

3 个答案:

答案 0 :(得分:2)

matches方法将始终尝试匹配整个字符串。它不是匹配特定字符串的合适方法。所以改变你的正则表达式,

".*\\bdog\\b.*"

按顺序使匹配方法返回true。

String str = "dog plays";
System.out.println(str.matches(".*\\bdog\\b.*"));

输出:

true

\b称为单词边界,它在单词字符和非单词字符之间匹配。请注意,上面的正则表达式也匹配字符串foo:dog:bar。如果你想让狗成为一个单独的词,我建议你使用这个正则表达式。

".*(?<!\\S)dog(?!\\S).*"

示例:

System.out.println("dog plays".matches(".*(?<!\\S)dog(?!\\S).*"));
System.out.println("foo:dog:bar".matches(".*(?<!\\S)dog(?!\\S).*"));

输出:

true
false

答案 1 :(得分:0)

这将返回false,因为它尝试匹配整个字符串 有关详细信息,请参阅:Boundary Matchers

所以要正确使用".*\\bdog\\b.*",正如阿维纳什正确地说的那样。

答案 2 :(得分:0)

对于Matcher类:

    如果整个字符串与表达式匹配,则
  • matches()返回true

  • 如果字符串的任何子序列与表达式匹配,则
  • find()返回true。

所以这很可能就是您想要的:

public class Test {

    public static void main(String[] args) {

        String str = "The dog plays";
        boolean t = str.find("\\bdog\\b");

        System.out.println(t);

    }
}