2014-02-17 68 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开始