Java Scala REPL中的Unicode正则表达式
我想检测Unicode字母的单词(Java Scala REPL中的Unicode正则表达式,java,regex,scala,unicode,read-eval-print-loop,Java,Regex,Scala,Unicode,Read Eval Print Loop,我想检测Unicode字母的单词(\p{L}) 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\u 60-ea” 原因可能是什么?可能是解释器中使用的不兼容字符编码。例如,以下是我的输出: s
\p{L}
)
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\u 60-ea”
原因可能是什么?可能是解释器中使用的不兼容字符编码。例如,以下是我的输出:
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
。但是请注意,(这有点旧):
我们找到的唯一可靠的设置默认字符的方法
Scala的编码是在运行
应用程序:
$JAVA_OPTS=“-Dfile.encoding=utf8”scala
[...]
仅仅尝试设置scala-Dfile.encoding=utf8似乎不起作用。[……]
这里的情况并非如此,但也可能发生:或者,您的“ä”可以是后面跟着“a”的符号,例如: 这有时是一些系统的一个问题,这些系统通过创建变音符号(我认为OSX就是一个问题,至少在某些版本中是如此)。有关详细信息,.您还可以“启用预定义字符类和POSIX字符类的Unicode版本”,如和中所述 这意味着您可以使用诸如“\w”之类的字符类来匹配Unicode字符,如下所示:
"(?U)\\w+".r.findFirstIn("pässi")
在上面的regexp中,“(?U)”位是一个嵌入的标志表达式,它为regexp打开UNICODE_字符_类标志
从Java 7开始就支持此标志。请参阅为什么您的正则表达式不够充分。您需要
\p{L}\p{M}*
+1。我没有考虑过,就是这样。code>scala>System.getProperty(“file.encoding”)为我提供了res0:String=Cp1252
,因为我在Windows上。谢谢你提供的信息。@pvorb:谢谢你提供的信息,我将编辑这篇文章,相应地突出显示“主要”解决方案。
"(?U)\\w+".r.findFirstIn("pässi")