Java регулярное выражение всегда терпит неудачу - PullRequest
12 голосов
/ 12 мая 2011

У меня есть шаблон регулярных выражений Java и предложение, которое я хотел бы полностью сопоставить, но для некоторых предложений оно ошибочно завершается неудачей. Почему это? (для простоты я не буду использовать свое сложное регулярное выражение, а просто ". *")

System.out.println(Pattern.matches(".*", "asdf"));
System.out.println(Pattern.matches(".*", "[11:04:34] <@Aimbotter> 1 more thing"));
System.out.println(Pattern.matches(".*", "[11:04:35] <@Aimbotter> Dialogue: 0,0:00:00.00,0:00:00.00,Default,{Orginal LV,0000,0000,0000,,[???]??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????} "));
System.out.println(Pattern.matches(".*", "[11:04:35] <@Aimbotter> Dialogue: 0,0:00:00.00,0:00:00.00,Default,{Orginal LV,0000,0000,0000,,[???]????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????} "));

Выход:

true
true
true
false

Обратите внимание, что четвертое предложение содержит 10 управляющих символов Юникода \ u0085 между знаками вопроса, которые не отображаются обычными шрифтами. Третье и четвертое предложения на самом деле содержат одинаковое количество символов!

Ответы [ 4 ]

13 голосов
/ 12 мая 2011

используйте

Pattern.compile(".*",Pattern.DOTALL)

, если хотите.соответствовать контрольным персонажам.По умолчанию он соответствует только печатным символам.

Из JavaDoc:

"В режиме точек все выражения. Соответствуют любому символу, включая символ конца строки. По умолчанию это выражение не соответствует символу конца строки.

Режим Dotall также можно включить с помощью выражения встроенного флага (? S). (S является мнемоникой для режима «однострочный», как это называется в Perl.) "

Код в шаблоне (есть ваш \ u0085):

/**
 * Implements the Unicode category ALL and the dot metacharacter when
 * in dotall mode.
 */
static final class All extends CharProperty {
boolean isSatisfiedBy(int ch) {
    return true;
}
}

/**
 * Node class for the dot metacharacter when dotall is not enabled.
 */
static final class Dot extends CharProperty {
boolean isSatisfiedBy(int ch) {
    return (ch != '\n' && ch != '\r'
                && (ch|1) != '\u2029'
                && ch != '\u0085');
    }
}
4 голосов
/ 12 мая 2011

Ответ в вопросе: 10 управляющих символов Юникода \ u0085

управляющие символы Unicode не распознаются. * Как \ n

2 голосов
/ 12 мая 2011

Unicode / u0085 - это новая строка - поэтому вы должны либо добавить (?s) - точка соответствует всем - в начало вашего регулярного выражения, либо добавить флаг при компиляции регулярного выражения.

Pattern.matches("(?s).*", "blahDeBlah\u0085Blah")
1 голос
/ 12 мая 2011

Проблема, которую я считаю, заключается в том, что \ u0085 представляет новую строку.Если вы хотите многострочное сопоставление, вам нужно использовать Pattern.MULTILINE или Pattern.DOTALL .Это не факт, что это Unicode - '\ n' тоже потерпит неудачу.

Чтобы использовать его: Pattern.compile(regex, Pattern.DOTALL).matcher(input).matches()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...