2014-02-17 5 views
6

Я хочу определить слова букв Юникода (\p{L}).Unicode Regex in Scala REPL

РЕПЛ Scala дает обратно 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 

Таким образом, решение запустить scala с -Dfile.encoding=UTF-8. Однако следует отметить, this blog post (что староват):

Единственный надежный способ мы нашли для установки по умолчанию символ кодировки для Scala на это установить $ JAVA_OPTS перед запуском приложения:

$ JAVA_OPTS="-Dfile.encoding=utf8" scala [...] Просто попытка установить scala -Dfile.encoding=utf8, похоже, не делает этого. [...]


был не тот случай, но также может произойти: в качестве альтернативы, ваш "ä" может быть 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», как описано в java.util.regex.Pattern и UNICODE_CHARACTER_CLASS

Это означает, что вы можете использовать классы символов, таких как «\ ш», чтобы соответствовать символы Unicode, как это :

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

В регулярном выражении выше «(? U)» бит внедренный флаг Выражения, повороты на флаге UNICODE_CHARACTER_CLASS для регулярного выражения.

Этот флаг поддерживается, начиная с Java 7.