Совпадение регулярных выражений Java string завершается неудачей с разрывом строки?

#java #android #regex

#java #Android #регулярное выражение

Вопрос:

 StringBuilder testSB = new StringBuilder();
String testString = "error 1:";
int times = 0;
while(times<=10){
    testSB.append(testString  "n");
    times  ;
}

String testResponse  = "error 1:";
String realResponse = testSB.toString();

Log.i("REAL", String.valueOf(realResponse.matches(".*error.*")));
Log.i("TEST", String.valueOf(testResponse.matches(".*error.*")));
  

«Реальная» строка не соответствует, в то время как «тестовая» строка соответствует. Если я удалю "n" из блока while, он будет соответствовать регулярному выражению. Я думал .* , что также будет применяться для новой строки?

Комментарии:

1. Разрыв строки обычно не является частью . в регулярных выражениях. Обычно вам нужно специально указать движку регулярных выражений, чтобы включить их. Однако удобный метод matches() в классе String не позволит вам этого сделать. Скорее всего, вам нужно будет собрать Pattern и создать Matcher из него. Там вы можете установить соответствующий флаг для достижения этой цели.

2. @Till: в этом случае можно использовать встроенный модификатор (?s) (как указано в ответе pap).

Ответ №1:

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

Комментарии:

1. для сопоставления foo в строке с новыми строками мне пришлось использовать "(?s).*foo(?s).*" , то есть мне пришлось поместить его перед каждым . символом.

Ответ №2:

. Совпадение с терминаторами строки зависит от того, активирован ли MULTILINE режим. Смотрите документацию Java для java.util.regex.Pattern.

Комментарии:

1. Это DOTALL режим, о котором вы думаете, а не MULTILINE . Эти режимы никогда не должны были существовать, и их имена всегда были отстойными, но, по крайней мере, Java изменила одинаково запутанное название «single-line» на несколько понятное «DOTALL».