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行(不是字符串文字)中输入正则表达式,那么它可以正常工作。
答案 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