为什么Java和Perl中的正则表达式行为不同?

2022-09-03 09:02:34

我的理解是,Java的正则表达式实现是基于Perl的。但是,在下面的示例中,如果我使用相同的字符串执行相同的正则表达式,则 Java 和 Perl 将返回不同的结果。

下面是 Java 示例:

public class RegexTest {
    public static void main( String args[] ) {
        String sentence = "This is a test of regular expressions.";
        System.out.println( sentence.matches( "\\w" ) ? "Matches" : "Doesn't match" );
    }
}

返回:不匹配

下面是 Perl 示例:

my $sentence = 'This is a test of regular expressions.';
print ( $sentence =~ /\w/ ? "Matches" : "Doesn't match" ) . "\n";

这将返回:匹配项

对我来说,Perl结果是有道理的。它查找单个单词字符的匹配项。我不明白为什么Java不认为它是匹配的。造成这种差异的原因是什么?


答案 1

Java 方法正在测试正则表达式是否与整个 .要测试是否可以在字符串中的任何位置找到正则表达式,请创建一个 Matcher 并使用其 find 方法。matchesString


答案 2

此外,Perl 正则表达式语法不是 Java 正则表达式语法。

在这种情况下,它不一定适用,但这是对您更一般问题的更多答案。

Java有一个称为“PCRE”的正则表达式语法,即:Perl Compatible。

然而,这个名字具有严重的误导性,因为很少有关于它真正与Perl兼容的内容。

例如,Perl正则表达式允许在表达式本身和许多其他高级运算符中执行代码,并且Perl中的一些语法与其他语言中的语法不同(即:许多语言使用和作为单词边界标记,但Perl只使用'\b')\>\<

花几分钟时间阅读一些PerlRe文档,你会发现很多非常棒的技巧,Perl的正则表达式引擎可以做到其他任何东西都做不到。