По умолчанию ^
и $
соответствуют началу и концу всей входной строки соответственно, игнорируя любые символы новой строки. Я бы ожидал, что ваше выражение не будет соответствовать строке, которую вы упомянули. Действительно:
String pattern = "^CLASSIC(\\s*)$";
String input = "CLASSIC STF%nCLASSIC";
Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(String.format(input));
while (m.find()) {
System.out.println(m.group());
}
распечаток результатов нет.
Если вы хотите, чтобы ^
и $
соответствовали началу и концу всех строк в строке, вы должны включить «многострочный режим». Сделайте это, заменив строку 3 выше на Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE + Pattern.MULTILINE);
. Когда я это делаю, я получаю один результат, а именно: «CLASSIC».
Вы также спросили, почему «CLASSIC STF» не соответствует. Давайте разложим ваш шаблон, чтобы понять, почему. Картина говорит: все, что соответствует ...
- начинается в начале строки ~
^
- начинается с C, а затем с помощью L, A, S, S, I и C ~
CLASSIC
- , после чего 0 или более пробельные символы следуют ~
(\s*)
- , после чего мы видим окончание строки ~
$
после согласования места в «CLASSIC СТП» (ул ep 3), мы смотрим на символ «S». Это не соответствует окончанию строки (шаг 4), поэтому мы не можем сопоставить регулярное выражение.
Обратите внимание, что круглые скобки в вашем регулярном выражении не нужны. Вы можете их оставить.
The Javadoc of the Pattern class очень сложный. Было бы полезно прочитать его.
EDIT:
Если вы хотите проверить, если строка/строка содержит слово «CLASSIC» с использованием регулярных выражений, то я рекомендовал бы использовать регулярное выражение \bCLASSIC\b
.Если вы хотите увидеть, начинается ли строка со слова «CLASSIC», я бы использовал ^CLASSIC\b
.
Вы смотрели в решении, которое использует '$' и/или '^'? – reto
@reto yup Я посмотрел. – Shann