Соответствие границ строк в регулярном выражении (Pattern.MULTILINE / (? M)) нарушено в Java? - PullRequest
1 голос
/ 25 апреля 2010

Пример на http://www.exampledepot.com/egs/java.util.regex/Line.html дает мне дважды false, но не должен! Почему?

CharSequence inputStr = "abc\ndef";
String patternStr = "abc$";

// Compile with multiline enabled
Pattern pattern = Pattern.compile(patternStr, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.find();    // true

// Use an inline modifier to enable multiline mode
matchFound = pattern.matches(".*abc$.*", "abc\r\ndef");     // false
System.out.println(matchFound); // false
matchFound = pattern.matches("(?m).*abc$.*", "abc\r\ndef"); // true
System.out.println(matchFound);// false !!!!!

Ну, если я добавлю дополнительно (? S), это работает, но не должно ли это работать без (? S)? Изменилось ли это поведение в прошлом или авторы просто проверили там пример?

Ответы [ 2 ]

1 голос
/ 25 апреля 2010

Прежде всего, exampledepot.com - чрезвычайно плохой сайт: никогда никогда не допускайте, чтобы что-то там было «истиной».

В регулярном выражении $ никогда не соответствует символу, оно соответствует позиции. В режиме (?m) это соответствует «пустой строке» перед разрывом строки или концом строки. Поэтому, учитывая строку "abc\r\ndef", регулярное выражение ".*abc$.*" не совпадает, поскольку \r\n отсутствует в вашем регулярном выражении. $ соответствует положению между c и \r.

Что вы должны сделать, это:

System.out.println("abc\r\ndef".matches(".*abc$\r\n.*"));     // false
System.out.println("abc\r\ndef".matches("(?m).*abc$\r\n.*")); // true
0 голосов
/ 25 апреля 2010

Я не знаком с тем, как работает вики сообщества, но не стесняйтесь использовать этот пример, если сочтете полезным.

    System.out.println(
        Pattern.matches("(?m)^abc$\n^def$", "abc\ndef")
    ); // prints "true"

    System.out.println(
        Pattern.matches("(?sm)^abc$.^def$", "abc\ndef")
    ); // prints "true"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...