2013-03-06 13 views
12

Używam tego regex:podzielonego String, słowa w tym znaków akcentowanych

x.split("[^a-zA-Z0-9']+"); 

ta zwraca tablicę ciągów liter i/lub cyfr.

Jeśli używam to:

String name = "CEN01_Automated_TestCase.java"; 
String[] names = name.Split.split("[^a-zA-Z0-9']+"); 

mam:

CEN01 
Automated 
TestCase 
Java 

Ale jeśli mogę użyć tego:

String name = "CEN01_Automação_Caso_Teste.java"; 
String[] names = name.Split.split("[^a-zA-Z0-9']+"); 

mam:

CEN01 
Automa 
o 
Caso 
Teste 
Java 

Jak mogę zmodyfikować to wyrażenie regularne, aby zawierało znaki akcentowane? (á, ã, õ, etc ...)

+1

Jeśli Java obsługuje właściwości Unicode, "[^ \ p {L}]" będzie dość odporne. Nie wiem, czy to prawda ... – Wrikken

+1

@Wrikken: Tak. Java 7 obsługuje nawet '\ w' i' \ b' w sensie Unicode. –

+0

Miło, byłem po prostu leniwy, aby to sprawdzić, ale należycie odnotowany;) – Wrikken

Odpowiedz

9

Od http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

kategoriach, które zachowują się jak java.lang.Character boolean ismethodname metod (z wyjątkiem nieaktualnych nich) są dostępne za pośrednictwem tego samego \p{prop} składni gdzie określona właściwość ma nazwę javamethodname.

Od Character klasa zawiera isAlphabetic metody można użyć

name.split("[^\\p{IsAlphabetic}0-9']+"); 

Można również użyć

name.split("(?U)[^\\p{Alpha}0-9']+"); 

ale trzeba będzie użyć UNICODE_CHARACTER_CLASS banderą, które mogą być wykorzystane przez dodanie (?U) w regex .

+1

Człowieku, to jest piękne * - *. Pomogło mi to również. Dzięki! – Jvam

+0

Cieszę się, że Ci się podoba. Możesz znaleźć wiele przydatnych informacji w [Dokumentacja wzoru] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html) :) – Pshemo

2

Chciałbym sprawdzić Java Documentation on Regular Expressions. Istnieje sekcja unicode, która moim zdaniem jest tym, czego możesz szukać.

EDIT: Przykład

Innym sposobem byłoby dopasować na kod znaku, którego szukasz. Na przykład

\uFFFF where FFFF is the hexadecimal number of the character you are trying to match. 

Przykład: \u00E0 matches à

sobie sprawę, że backslash trzeba będzie uciec w Javie, jeśli używasz go jako ciąg dosłownym.

Przeczytaj więcej na ten temat here.

+0

Prawdopodobnie masz rację, ale mój głos jest za tym, który podaje tutaj przykład roboczy. –

+1

Zobacz zaktualizowaną odpowiedź. –

1

Dlaczego nie podzielić na znaki separatora?

String[] names = name.split("[_.]"); 
+0

Dzięki! Pomógł mi znaleźć rozwiązanie! – Jvam

0

Zamiast czarnej listy wszystkich znaków, których nie chcesz, zawsze można whitlist znaki, które mają jak:

^[^<>%$]*$ 

wyrażeniu [^ (wiele znaków tutaj)] po prostu dopasowuje dowolny znak, który nie jest katalogowany.

Ale to jest osobista opinia.

2

Można to wykorzystać:

String[] names = name.split("[^a-zA-Z0-9'\\p{L}]+"); 

System.out.println(Arrays.toString(names)); wyświetli:

[CEN01, Automacao, Caso, Teste, Java]

Zobacz this aby uzyskać więcej informacji.

Powiązane problemy