Java regex всегда терпит неудачу
У меня есть шаблон регулярного выражения 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 управляющих символов Unicode\u0085 между вопросительными знаками, которые не отображаются обычными шрифтами. Третье и четвертое предложения фактически содержат одинаковое количество символов!
Ответы
Ответ 1
использовать
Pattern.compile(".*",Pattern.DOTALL)
если хотите. для соответствия управляющим символам. По умолчанию он соответствует только печатаемым символам.
Из JavaDoc:
"В режиме dotall выражение соответствует любому символу, включая терминатор строки. По умолчанию это выражение не соответствует терминаторам строк.
Режим 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');
}
}
Ответ 2
Ответ на вопрос: 10 управляющих символов Юникода \u0085
Управляющие символы unicode arent распознаются. * точно так же, как\n
Ответ 3
Unicode/u0085 - это новая строка, поэтому вам нужно либо добавить (?s)
- dot match all - в начало вашего регулярного выражения, либо добавить флаг при компиляции регулярного выражения.
Pattern.matches("(?s).*", "blahDeBlah\u0085Blah")
Ответ 4
Я считаю, что проблема заключается в том, что \u0085 представляет собой новую строку. Если вам нужно многострочное совпадение, вам нужно использовать Pattern.MULTILINE или Pattern.DOTALL. Это не факт, что это Unicode - "\n" тоже сбой.
Чтобы использовать его: Pattern.compile(regex, Pattern.DOTALL).matcher(input).matches()