2010-04-25 3 views
1

http://www.exampledepot.com/egs/java.util.regex/Line.html의 예는 나에게 두 번 거짓을 나타내지 만해야합니다! 왜?정규식 (Pattern.MULTILINE/(? m))의 라인 경계선 맞추기가 Java에서 중단 되었습니까?

CharSequence inputStr = "abc\ndef"; 
String patternStr = "abc$"; 

// Compile with multiline enabled 
Pattern pattern = Pattern.compile(patternStr, Pattern.MULTILINE); 
Matcher matcher = pattern.matcher(inputStr); 
boolean matchFound = matcher.find(); // true 

// Use an inline modifier to enable multiline mode 
matchFound = pattern.matches(".*abc$.*", "abc\r\ndef");  // false 
System.out.println(matchFound); // false 
matchFound = pattern.matches("(?m).*abc$.*", "abc\r\ndef"); // true 
System.out.println(matchFound);// false !!!!! 

글쎄, 추가로 (? s) 넣으면 작동하지만 (? s) 없이는 작동하지 않아야합니까? 과거에 이런 행동이 바뀌 었습니까? 아니면 저자가 단순히 예제를 확인하지 않았습니까?

+0

왜이 커뮤니티는 위키입니까? –

답변

1

먼저 exampledepot.com은 매우 나쁜 사이트입니다. 결코 은 "진실"인 것으로 간주됩니다.

정규 표현식에서 $은 문자와 일치하지 않으며 위치와 일치합니다. (?m) 모드에서는 줄 바꿈 이전의 "빈 문자열"또는 문자열의 끝과 일치합니다. 문자열 "abc\r\ndef"이 주어지면 \r\n이 정규 표현식에 없기 때문에 ".*abc$.*" 정규 표현식이 일치하지 않습니다. $c\r 사이의 위치와 일치합니다.

은 당신이해야 할 것은 이것이다 :

System.out.println("abc\r\ndef".matches(".*abc$\r\n.*"));  // false 
System.out.println("abc\r\ndef".matches("(?m).*abc$\r\n.*")); // true 
0

내가 커뮤니티 위키 작동하는 방법에 익숙하지 않은 해요,하지만 유용하다고 인정하는 경우,이 예제를 사용하여 주시기 바랍니다.

System.out.println(
     Pattern.matches("(?m)^abc$\n^def$", "abc\ndef") 
    ); // prints "true" 

    System.out.println(
     Pattern.matches("(?sm)^abc$.^def$", "abc\ndef") 
    ); // prints "true" 
관련 문제