2016-04-08 2 views
0

Я пытаюсь найти несколько совпадений в своем регулярном выражении. Вот мое регулярное выражениеregex не соответствует нескольким строкам

final Pattern p = Pattern.compile("^[0-9]{8}[#](FRI|SAT|SUN)[\r]$"); 
final Matcher m = p.matcher("09042012#SUN\r" + "09022012#FRI\r" + "09032012#SAT\r"); 
    while (m.find()) 
    { 
     final String result = m.group(); 
     System.out.println(result); 
    } 

это работает, если строка имеет только один матч, но если его матчей подряд он не работает. Я попытался добавить + в конце моего регулярного выражения, чтобы убедиться, что он по крайней мере имеет одно совпадение. Это тоже не работает.

Что я делаю неправильно?

ответ

0

^ и $ по умолчанию представляют начало/конец всего ввода (передано в Matcher), а не начало/конец строк.

Если вы хотите, чтобы ваше регулярное выражение соответствовало только линиям, используйте в своем регулярном выражении флаг Pattern.MULTILINE.
Также удалите [\r], так как персонажи считаются размещенными в следующей строке, что означает, что $, размещенные после [\r], могут только соответствовать концу следующей строки - другими словами, вы найдете только совпадение, имеющее следующую строку пустым.

Так что ваш код должен выглядеть как

final Pattern p = Pattern.compile("^[0-9]{8}[#](FRI|SAT|SUN)$", Pattern.MULTILINE); 
//                ^^^^^^^^^^^^^^^^^ 
final Matcher m = p.matcher(
      "09042012#SUN\r" 
     + "09022012#FRI\r" 
     + "09032012#SAT\r"); 
while (m.find()) 
{ 
    final String result = m.group(); 
    System.out.println(result); 
} 
2

Вы должны установить флаг многострочного:

final Pattern p = Pattern.compile("^[0-9]{8}[#](FRI|SAT|SUN)$", Pattern.MULTILINE); 

Это позволит $ и ^ для соответствия каретка возвращается \r в вашем входе.

0

Удалить строки запуска ^ и конец строки $, ваш код будет работать:

final Pattern p = Pattern.compile("[0-9]{8}[#](FRI|SAT|SUN)[\r]"); 
final Matcher m = p.matcher("09042012#SUN\r" + "09022012#FRI\r" + "09032012#SAT\r"); 
    while (m.find()) 
    { 
     final String result = m.group(); 
     System.out.println(result); 
    }