2014-02-17 10 views
6

Ich möchte Wörter von Unicode Letters (\p{L}) erkennen.Unicode Regex in Scala REPL

Scala REPL gibt zurück false für die folgende Erklärung ab, während in Java es true ist (welches das richtige Verhalten ist):

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

Sowohl Java und Scala sind in JRE läuft 1,7:

System.getProperty("java.version") gibt zurück "1.7.0_60-ea"

Was könnte der Grund dafür sein?

+1

http://stackoverflow.com/questions/5315330/matching-ega-unicode-letter-with-java-regexps Sehen Sie, warum Ihre regex nicht ganz ausreichend. Du brauchst '\ p {L} \ p {M} *' –

+0

+1. Das habe ich nicht bedacht. – pvorb

Antwort

4

Wahrscheinlich eine nicht kompatible Zeichencodierung, die im Interpreter verwendet wird. Zum Beispiel, hier ist meine Ausgabe:

scala> System.getProperty("file.encoding") 
res0: String = UTF-8 

scala> java.util.regex.Pattern.compile("\\p{L}").matcher("ä").matches() 
res1: Boolean = true 

So ist die Lösung scala mit -Dfile.encoding=UTF-8 laufen. Beachten Sie jedoch, this blog post (das ist ein bisschen alt):

Die einzige zuverlässige Art und Weise wir für die Einstellung der Standard-Zeichencodierung für Scala gefunden haben, ist $ JAVA_OPTS zu setzen, bevor Ihr Anwendung ausgeführt wird:

$ JAVA_OPTS="-Dfile.encoding=utf8" scala [...] Nur versuchen, scala -Dfile.encoding=utf8 einzustellen, scheint es nicht zu tun. [...]


war der Fall nicht hier, sondern kann auch passieren: alternativ Ihre "ä" a diaeresis (umlaut) Zeichen von "a" gefolgt sein könnte, zum Beispiel:

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

Dies ist manchmal ein Problem auf einigen Systemen, die Diakritika durch Unicode combining characters erstellen (ich denke, OS X ist zumindest in einigen Versionen eins). Für weitere Informationen, see Paul's question.

+1

Das war's. 'scala> System.getProperty (" file.encoding ")' gibt mir 'res0: String = Cp1252', da ich unter Windows bin. Danke für die Information. – pvorb

+0

@pvorb: Danke für die Info, ich werde den Beitrag bearbeiten, um die "Haupt" -Lösung entsprechend hervorzuheben. –

1

können Sie auch „Aktivieren Sie die Unicode-Version von Vordefinierte Zeichenklassen und POSIX-Zeichenklassen“, wie er in java.util.regex.Pattern beschrieben und UNICODE_CHARACTER_CLASS

Das heißt, Sie Zeichenklassen wie ‚\ w‘ wie diese passen Zeichen Unicode verwenden können :

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

In dem oben regexp '(? U)' Bit ist ein eingebettetes Flag Ausdrücke, die für den regulären Ausdruck auf der UNICODE_CHARACTER_CLASS Flag schaltet.

Dieses Flag unterstützt von Java Start 7.