2013-11-22 2 views
1

у меня есть следующие строки:точного совпадения строки с регулярным выражением

CLASSIC STF 
CLASSIC 

Я использует регулярное выражение для соответствия строк.

Pattern p = Pattern.compile("^CLASSIC(\\s*)$", Pattern.CASE_INSENSITIVE); 

CLASSIC STF также отображается. я использую m.find() Как это возможно, что отображается только CLASSIC не CLASSIC STF

Спасибо за помощь.

+0

Вы смотрели в решении, которое использует '$' и/или '^'? – reto

+0

@reto yup Я посмотрел. – Shann

ответ

2

Если вы используете Matcher.find(), то выражение CLASSIC(\s*) будет соответствовать CLASSIC STF. Matcher.matches() вернет false, однако, поскольку для этого требуется, чтобы выражение соответствовало вводу всего.

Чтобы сделать Matcher.find(), сделайте то же самое, измените выражение на ^CLASSIC(\s*)$, как сказано reto.

+0

Я считаю, что этот ответ неверен. Или, по крайней мере, я этого не понимаю. «CLASSIC (\ s *)» не будет соответствовать «CLASSIC STF» (он будет соответствовать только первым 8 символам), поэтому инструкция открытия неверна. «\ s» соответствует символам whitspace. – Rinke

+0

@ Rinke, это зависит от того, как вы определяете _matches_: если вы используете 'Matcher.matches()', то ваш оператор верен, так как вход _entire_ должен совпадать. Тем не менее, если вы используете 'Matcher.find()' 'CLASSIC (\ s *)' _will_, можно найти в 'CLASSIC STF' (поскольку даже' CLASSIC' сам будет соответствовать). Как правило, регулярное выражение соответствует любой подстроке, то есть наиболее распространенной формой является то, что делает 'find()'. – Thomas

+0

Хорошо, я вижу вашу мысль. Наверное, я бы сказал, что 'Matcher.find()' будет соответствовать * подстроке * в «CLASSIC STF», но не самой строке. По моему мнению, последнее будет вводить в заблуждение. Спасибо за разъяснение в любом случае. – Rinke

2

По умолчанию ^ и $ соответствуют началу и концу всей входной строки соответственно, игнорируя любые символы новой строки. Я бы ожидал, что ваше выражение не будет соответствовать строке, которую вы упомянули. Действительно:

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» не соответствует. Давайте разложим ваш шаблон, чтобы понять, почему. Картина говорит: все, что соответствует ...

  1. начинается в начале строки ~ ^
  2. начинается с C, а затем с помощью L, A, S, S, I и C ~ CLASSIC
  3. , после чего 0 или более пробельные символы следуют ~ (\s*)
  4. , после чего мы видим окончание строки ~ $

после согласования места в «CLASSIC СТП» (ул ep 3), мы смотрим на символ «S». Это не соответствует окончанию строки (шаг 4), поэтому мы не можем сопоставить регулярное выражение.

Обратите внимание, что круглые скобки в вашем регулярном выражении не нужны. Вы можете их оставить.

The Javadoc of the Pattern class очень сложный. Было бы полезно прочитать его.

EDIT:

Если вы хотите проверить, если строка/строка содержит слово «CLASSIC» с использованием регулярных выражений, то я рекомендовал бы использовать регулярное выражение \bCLASSIC\b.Если вы хотите увидеть, начинается ли строка со слова «CLASSIC», я бы использовал ^CLASSIC\b.

+0

спасибо за объяснение – Shann

1

Интересно, если это поможет: практика = с ("CLASSIC СТП", "CLASSIC") Grep ("^ CLASSIC [[: пространство:] СТП]?", Практика)

Смежные вопросы