Подтвердить что ты не робот

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 между вопросительными знаками, которые не отображаются обычными шрифтами. Третье и четвертое предложения фактически содержат одинаковое количество символов!

4b9b3361

Ответ 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()