#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».