2012-02-09 10 views
6

Bir kelimem var: "Aiavärav". \w+ ifadesi bu sözcüğü yakalamalı, ancak "ä" harfi sözcüğü yarıya indirir. "Aiavärav" yerine "Aia" yı alırım. Ascii olmayan harfleri içeren kelimeler için doğru ifade nedir?Java'nın Normal İfadesi, diğer dillerdeki karakterleri kelime karakterleri olarak tanımıyor (i.e w)

Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS) 

veya desende bir (?U) gömmek: Eğer UNICODE_CHARACTER_CLASS bayrağı belirtmedikçe

+0

Sözcüğü kopyaladım ve dizeye koydum, normal ifadeyi kullandım + w + ve sözcüğü doğru şekilde alabiliyorum. C# ile test ediyorum. –

+0

Java kullanıyorum. Ayrıca myregextester.com ile test ettim ve hala tüm kelimeyi tanımıyor. – jyriand

+0

Belki de [Unicode harfler] 'e bakmak istersiniz (http://www.regular-expressions.info/unicode.html)? '\ p {L} +' – Wiseguy

cevap

12

the documentation göre, \w sadece [a-zA-Z_0-9] maçları

Pattern.compile("(?U)\\w+") 

bunlardan herhangi biri JDK 1.7 gerektirir (yani, Java 7). (; [a-zA-Z] gibi ama değil ASCII özgü "harfi") ve \p{N} ("sayı"; Java 7 yoksa

, sen \p{L} kullanarak Unicode \w genelleme yapabiliriz [0-9] gibi ama değil ASCII) özel:

Pattern.compile("[\\p{L}_\\p{N}]+") 

Ama belki (programlama dili anlamında aksine) normal anlamda, fiili kelime aradığınız gibi geliyor, ve rakam ve alt desteklemek gerekmez ?

Pattern.compile("\\p{L}+") 

(Bu arada, kıvırcık parantez aslında — isteğe bağlıdır Eğer \pL yerine p{L} yerine \p{N} — ait \pN yazabilir ama insanlar genelde, çünkü zaten onları şunlardır: Bu durumda, sadece \p{L} kullanabilirsiniz \p{Lu} "büyük harf" gibi çok harfli kategoriler için gereklidir.)

+0

Katıştırmanın (? U) "... bir performans cezası uygulayabileceğini unutmayın." http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#UNICODE_CHARACTER_CLASS – reallynice

+0

@niconic: Bağladığınız belgeler aslında "UNICODE_CHARACTER_CLASS" yerine " (? U) ', ancak her iki şekilde de, pahalı parçanın Unicode karakter özelliklerini (ASCII karakterleri gruplarına kıyasla) kullanarak eşleştiğini düşünüyorum. OP'nin yapmaya çalıştığı şey tam olarak bu olduğu için, gerçekte bir "performans cezası" değildir ve muhtemelen alabileceği her türlü * yaklaşıma uygulanacaktır. – ruakh

+0

Belki yanılıyorum, ancak UNICODE_CHARACTER_CLASS bağlantısında da okuduğum UNICODE_CHARACTER_CLASS modu da gömülü bayrak ifadesiyle (? U) etkinleştirilebilir. 'Bence aynı şeylerden bahsediyoruz. Bir şeyi yanlış anladım mı? Tabii ki cevabınız ihtiyacınıza uyuyor, ben sadece şunu belirtmek istedim (çünkü kendimi belirsiz bir benzer durumda buldum ve performans benim için önemliydi) – reallynice

İlgili konular