2013-04-11 3 views
2

Может ли кто-нибудь помочь с регулярным выражением? Этот код работает хорошо.Java regex. Странное поведение

public static void main(String[] args) { 

    String s = "with name=successfully already exist\n"; 

    Pattern p = Pattern.compile(".+name=.*successfully.+", Pattern.DOTALL); 
    java.util.regex.Matcher m = p.matcher(s); 

    if (m.matches()) { 
     System.out.println("match"); 
    } else { 
     System.out.println("not match"); 
    } 

} 

Но этот код возвращает «не соответствует». Зачем?

public static void main(String[] args) { 

    String s = "with name=successfully already exist\n"; 

    if (s.matches(".+name=.*successfully.+")) { 
     System.out.println("match"); 
    } else { 
     System.out.println("not match"); 
    } 

} 

ответ

5

Единственное отличие между ними - это флаг DOTALL в первом примере.

Без этого флага \n в конце строки не будет соответствовать последнему рисунку (.+).

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#DOTALL

В dotall режиме, выражение. соответствует любому символу, включая терминатор линии. По умолчанию это выражение не соответствует терминаторам строк.

matches Обратите внимание, что пытается соответствовать всей строке (в том числе и в вашем случае символа новой строки), а не просто пытаться найти подстроку (это отличается в Java, чем от многих других языков).

4

Параметр Pattern.DOTALL, который вы предоставляете при использовании команды compile(), делает так, что '.' совпадает с концевыми терминаторами строк. Вам нужно предоставить встроенный тег, чтобы сделать match(). Попробуйте следующее:

s.matches("(?s).+name=.*successfully(?s).+") 

Cheers.

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