2013-09-07 13 views
14

Przeszukałem sieć pod kątem mojego zapytania, ale nie dostałem odpowiedzi, która dokładnie pasuje do moich wymagań. Mam ciąg jak poniżej:Obsługa separatora ze znakami escape w Java String.split() metoda

A|B|C|The Steading\|Keir Allan\|Braco|E 

moje wyjście powinno wyglądać jak poniżej:

A 
B 
C 
The Steading|Keir Allan|Braco 
E 

Moje wymogiem jest, aby pominąć separator jeśli jest poprzedzony sekwencji ucieczki. Próbowałem następujących wykluczających lookbehinds w String.split():

(?<!\\)\| 

Ale mój problem jest separator zostaną zdefiniowane przez użytkownika końcowego dynamicznie i nie musi być zawsze |. Może to być dowolny znak na klawiaturze (bez ograniczeń). W związku z tym mam wątpliwości, czy powyższe wyrażenie może zawieść dla niektórych znaków specjalnych, które nie są dozwolone w regex.

Chciałam tylko wiedzieć, czy jest to idealny sposób na zrobienie tego.

Odpowiedz

24

Można użyć Pattern.quote():

String regex = "(?<!\\\\)" + Pattern.quote(delim); 

Korzystanie przykład:

String delim = "|"; 
String regex = "(?<!\\\\)" + Pattern.quote(delim); 

for (String s : "A|B|C|The Steading\\|Keir Allan\\|Braco|E".split(regex)) 
    System.out.println(s); 
 
A 
B 
C 
The Steading\|Keir Allan\|Braco 
E 

można rozszerzyć to użycie sekwencji ucieczki niestandardową, a także:

String delim = "|"; 
String esc = "+"; 
String regex = "(?<!" + Pattern.quote(esc) + ")" + Pattern.quote(delim); 

for (String s : "A|B|C|The Steading+|Keir Allan+|Braco|E".split(regex)) 
    System.out.println(s); 
 
A 
B 
C 
The Steading+|Keir Allan+|Braco 
E 
+0

Dzięki za szybką odpowiedź. Ale chciałbym wiedzieć, czy wszystkie znaki specjalne są dozwolone w regex. Wszelkie wyjątki od tego? – user2757740

+0

@ user2757740 Przeczytaj połączoną dokumentację 'Pattern.quote()'; pobiera ciąg znaków i usuwa wszystkie znaki specjalne. Nie ma żadnych wyjątków. – arshajii

+0

To rozwiązało większość mojego pytania. Wielkie dzięki. Ale chciałem zaimplementować ten sam pattern.quote() również dla mojej sekwencji ucieczki. Ale, obawiam się, że to nie działa :((? user2757740

Powiązane problemy