Почему регулярные выражения в Java и Perl действуют по-разному?

Я понимаю, что реализация регулярных выражений 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 matches проверяет, соответствует ли регулярное выражение всем String. Чтобы проверить, можно ли найти регулярное выражение в любом месте строки, создайте Matcher и используйте find.

Ответ 2

Кроме того, синтаксис regex Perl не является синтаксисом Java Regex.

В этом случае это не обязательно, но это более ответ на ваш более общий вопрос.

Java имеет синтаксис регулярного выражения, известный как "PCRE", то есть: Perl Compatible.

Это имя, однако, грубо вводит в заблуждение, потому что в нем очень мало, что действительно совместимо с Perl.

Например, регулярные выражения Perl позволяют выполнять код в самом выражении, а множество других расширенных операторов и некоторый синтаксис различны в Perl, так как они находятся на других языках (например, на многих языках используются \> и \< как маркеры границ слов, но Perl просто использует '\ b')

Проведите несколько минут, чтобы прочитать некоторые из PerlRe Documentation, и вы обнаружите множество потрясающих трюков, которые может использовать механизм регулярного выражения Perl ничего больше не кажется.