2011-05-12 4 views
12

자바 정규식 패턴과 문장을 완전히 일치시키고 싶지만 일부 문장의 경우에는 잘못 입력하게됩니다. 왜 이런거야? (편의상, 내 복잡한 정규식을 사용하지만, 그냥하지 않습니다 "*.")Java 정규식은 항상 실패합니다.

System.out.println(Pattern.matches(".*", "asdf")); 
System.out.println(Pattern.matches(".*", "[11:04:34] <@Aimbotter> 1 more thing")); 
System.out.println(Pattern.matches(".*", "[11:04:35] <@Aimbotter> Dialogue: 0,0:00:00.00,0:00:00.00,Default,{Orginal LV,0000,0000,0000,,[???]??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????} ")); 
System.out.println(Pattern.matches(".*", "[11:04:35] <@Aimbotter> Dialogue: 0,0:00:00.00,0:00:00.00,Default,{Orginal LV,0000,0000,0000,,[???]????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????} ")); 

출력 : 네 번째 문장 사이에 u0085을 \ 10 개 유니 코드 제어 문자를 포함

true 
true 
true 
false 

주 물음표는 일반 글꼴로 표시되지 않습니다. 세 번째와 네 번째 문장은 실제로 동일한 양의 문자를 포함합니다!

+0

... –

+0

이 http://www.fileformat.info/info/unicode/char (악화 될 것 /85/index.htm) – rurouni

+0

... @ tchrist는 곧 Java 정규 표현식 엔진이 얼마나 고장 났는지에 대해 모두 알려줄 것입니다. – aioobe

답변

13

사용. 제어 문자를 일치시킵니다. 기본적으로 인쇄 가능한 문자 만 일치합니다. 의 JavaDoc에서

:

DOTALL 모드에서

"식 줄 끝을 포함한 모든 문자와 일치 기본적으로이 표현은 줄 끝과 일치하지 않는

DOTALL 모드도를 통해 사용할 수 있습니다 ... 포함 된 플래그 표현 (의 S이는 펄에서 소위는 "한 줄"모드에 대한 니모닉입니다.) "

코드 패턴에 (당신의 \의 u0085가) (들?).

/** 
* Implements the Unicode category ALL and the dot metacharacter when 
* in dotall mode. 
*/ 
static final class All extends CharProperty { 
boolean isSatisfiedBy(int ch) { 
    return true; 
} 
} 

/** 
* Node class for the dot metacharacter when dotall is not enabled. 
*/ 
static final class Dot extends CharProperty { 
boolean isSatisfiedBy(int ch) { 
    return (ch != '\n' && ch != '\r' 
       && (ch|1) != '\u2029' 
       && ch != '\u0085'); 
    } 
} 
+0

감사합니다. (? s) 근무했습니다. Pattern.DOTALL을 사용하지 않았기 때문에 다른 패턴의 컴파일 된 패턴이 많이 있었기 때문에 (대부분의 패턴에 포함 된 문자열 상수에서) 한 번만 (? s)을 사용해야했습니다. –

4

대답은 질문에 : 10 유니 코드 제어 문자는 \ u0085

유니 코드 제어 문자는 인식이 arent * \ n

1

내가 믿는 문제가 \의 u0085은 줄 바꿈을 나타내는 것입니다처럼.. 여러 줄 일치를 원하면 Pattern.MULTILINE 또는 Pattern.DOTALL을 사용해야합니다. 그것은 유니 코드라는 사실이 아닙니다. '\ n'도 실패합니다.

는이 기능을 사용하려면

Pattern.compile(".*",Pattern.DOTALL) 

원하는 경우 Pattern.compile(regex, Pattern.DOTALL).matcher(input).matches()

2

유니 코드/u0085는 개행 문자입니다. (?s) - 모두 일치하는 점을 정규 표현식의 처음에 추가하거나 정규 표현식을 컴파일 할 때 플래그를 추가해야합니다. 자바는 유니 코드 라인 종결에 대해 알고하지 않는다면

Pattern.matches("(?s).*", "blahDeBlah\u0085Blah") 
자바는 유니 코드 정규식 엔진이기 때문 특히 홀수
+1

'(? m)'- 여러 줄 모드는 행의 시작/끝에서'^'와'$ '가 일치 함을 의미합니다. 단일 라인 모드에서'(? s)'를 원한다. 예, 혼란 스럽습니다 (아이디어는 "전체 입력을 마치 한 줄로 취급하는 것"입니다). –

+0

웁스, 당신은 정확합니다. 결정된. –