2014-02-17 69 views
6

我想檢測Unicode字母的單詞(\p{L})。Scala中的Unicode正則表達式REPL

Scala的REPL還給false爲下面的語句,而在Java是true(這是正確的行爲):

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

無論是Java和Scala在JRE 1.7上運行:

System.getProperty("java.version")給回"1.7.0_60-ea"

可能是什麼原因?

+1

見http://stackoverflow.com/questions/5315330/matching-ega-unicode-letter-with-java-regexps爲什麼你的正則表達式是不是很足夠。你需要'\ 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 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」)''給我'res0:String = Cp1252'因爲我在Windows上。感謝您的信息。 – pvorb

+0

@pvorb:感謝您的信息,我將編輯帖子以相應地突出顯示「主要」解決方案。 –

1

您也可以「啓用預定義的字符類和POSIX字符類的Unicode版本」作爲java.util.regex.Pattern描述和UNICODE_CHARACTER_CLASS

這意味着您可以使用字符類,比如「\ W」來匹配Unicode字符這樣:

"(?U)\\w+".r.findFirstIn("pässi") 

在上述「(?U)」正則表達式位爲嵌入式標誌表達式,關於UNICODE_CHARACTER_CLASS標誌正則表達式轉動。

這個標誌支持從Java 7開始