2014-02-17 3 views
6

유니 코드 문자 (\p{L})의 단어를 검색하고 싶습니다.스칼라에서 유니 코드 정규 표현식 REPL

java.util.regex.Pattern.compile("\\p{L}").matcher("ä").matches()

자바와 스칼라 모두 JRE 1.7에서 실행중인

:

자바는 (올바른 행동 인) true을있는 동안

스칼라의 REPL은 다시 false 다음 문에 대한 제공 System.getProperty("java.version") 답장 "1.7.0_60-ea"

그 이유는 무엇일까요?

+1

가 http://stackoverflow.com/questions/5315330/matching-ega-unicode-letter-with-java-regexps를 참조 자바 7부터 지원 충분한. '\ p {L} \ p {M} * ' –

+0

+1이 필요합니다. 나는 그것을 고려하지 않았다. – pvorb

답변

4

아마도 인터프리터에서 사용되는 호환되지 않는 문자 인코딩입니다.

scala> System.getProperty("file.encoding") res0: String = UTF-8 scala> java.util.regex.Pattern.compile("\\p{L}").matcher("ä").matches() res1: Boolean = true 

그래서 솔루션이 -Dfile.encoding=UTF-8으로 scala을 실행하는 것입니다 :
예를 들어, 여기 내 출력입니다. 그러나 this blog post 주 (인 약간 오래된) :

:

우리가 스칼라의 기본 문자 인코딩을 설정하는 것으로 나타났습니다 신뢰할 수있는 유일한 방법은 당신의 응용 프로그램을 실행하기 전에 JAVA_OPTS $를 설정하는 것입니다

$ JAVA_OPTS="-Dfile.encoding=utf8" scala [...] 그냥 설정하려고하면 scala -Dfile.encoding=utf8 보이지 않습니다. 예를 들면 양자 택일로, 당신의 "A"는 "A"다음에 a diaeresis (umlaut) 기호 수 :

scala> println("a\u0308")                        
ä                                                      
scala> java.util.regex.Pattern.compile("\\p{L}").matcher("a\u0308").matches()           
res1: Boolean = false 
을 [...]

여기이 아니었다, 또한 발생할 수 있습니다

이것은 종종 Unicode combining characters을 통해 발음 구별 부호를 만드는 시스템에서 문제가되는 경우가 있습니다 (OS X은 적어도 일부 버전에서는 하나라고 생각합니다). 자세한 내용은 see Paul's question을 참조하십시오.

+1

그게 전부 야. 'scala> System.getProperty ("file.encoding")'나는 Windows에 있기 때문에'res0 : String = Cp1252'를 제공합니다. 정보 주셔서 감사합니다. – pvorb

+0

@pvorb : 정보를 주셔서 감사 드리며, 해당 게시물을 편집하여 그에 따라 "주"솔루션을 강조 표시하겠습니다. –

1

또한 java.util.regex.Pattern 설명하고 UNICODE_CHARACTER_CLASS

이는이 같은 유니 코드 문자와 일치하는 등 '\ w'로 문자 클래스를 사용할 수 있다는 것을 의미로서 "미리 정의 된 문자 클래스와 POSIX 문자 클래스의 유니 코드 버전을 사용"할 수 있습니다 :

'(? U)'위의 정규 표현식에서
"(?U)\\w+".r.findFirstIn("pässi") 

비트는 정규 표현식에 대한 UNICODE_CHARACTER_CLASS 플래그집니다 임베디드 깃발 식이다. 당신의 정규식이 아주없는 이유

이 플래그는

관련 문제