2011-04-07 25 views
10

Czy ktoś mógłby mi pomóc z niektórych regex.Dzielenie ciągów przy użyciu Regex w Javie

Chcę podzielić następujący ciąg do numeru, numer ciąg

"810LN15"

1 metoda wymaga 810 zostaną zwrócone, inny wymaga LN i inny powinien powrócić 15.

Jedynym rozwiązaniem tego problemu jest użycie wyrażenia regularnego, ponieważ liczby będą rosły w długości:

Do jakiego regexa mogę się przyzwyczaić?

+0

Twoje pytanie nie jest jasne. Czy chcesz podzielić na "LN", czy na dowolną sekwencję alfabetyczną? –

+0

Hi Laurent. W różnych metodach potrzebuję uzyskać inną część tego ciągu, 1 metoda wymaga zwrócenia 810, inna wymaga LN, a ostatnia wymaga 15. Nie chcę iść w dół trasą z wykorzystaniem podciągów i liczby łańcuchów jako długości liczby mogą ulec zmianie. Twoja pomoc jest bardzo ceniona dzięki temu – Damien

Odpowiedz

16

String.split nie da pożądanego rezultatu, który prawdopodobnie byłby "810", "LN", "15", ponieważ musiałby poszukiwać tokena do podzielenia i rozebrał token.

Spróbuj Pattern i Matcher zamiast korzystania z tej regex: (\d+)|([a-zA-Z]+), które dopasować dowolny ciąg cyfr i liter i uzyskać odrębne grupy/numer tekstowe (czyli „AA810LN15QQ12345” doprowadziłoby do grupy „AA”, „810”, "LN", "15", "QQ" i "12345").

przykład:

Pattern p = Pattern.compile("(\\d+)|([a-zA-Z]+)"); 
Matcher m = p.matcher("810LN15"); 
List<String> tokens = new LinkedList<String>(); 
while(m.find()) 
{ 
    String token = m.group(1); //group 0 is always the entire match 
    tokens.add(token); 
} 
//now iterate through 'tokens' and check whether you have a number or text 
+0

Witaj Thomas, wielkie dzięki za twoje zgłoszenie, mój problem jest teraz rozwiązany – Damien

7

(\\d+)([a-zA-Z]+)(\\d+) powinno wystarczyć. Pierwsza grupa przechwytywania będzie pierwszą liczbą, druga grupa przechwytywania będzie literami pomiędzy, a trzecia grupa przechwytująca będzie drugą liczbą. Podwójne ukośniki odwrotne są dla java.

+0

Dziękuję bardzo za twój wkład Znak, pomógł mi rozwiązać mój problem – Damien

10

W Java, jak w większości regex smaków (Python jest godne uwagi wyjątków), przy czym split() regexpa nie jest wymagane zużywają dowolnych znaków, gdy znajdzie się dopasowanie. Tutaj użyłem lookaheads i lookbehinds dopasować dowolną pozycję, która ma cyfrowy jednego jej boku i non-cyfrowe drugiej:

String source = "810LN15"; 
String[] parts = source.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)"); 
System.out.println(Arrays.toString(parts)); 

wyjściowa:

[810, LN, 15] 
0

To daje dokładną czego szukacie?

 Pattern p = Pattern.compile("(([a-zA-Z]+)|(\\d+))|((\\d+)|([a-zA-Z]+))"); 
     Matcher m = p.matcher("810LN15"); 
     List<Object> tokens = new LinkedList<Object>(); 
     while(m.find()) 
     { 
      String token = m.group(1); 
      tokens.add(token); 
     } 
     System.out.println(tokens); 
Powiązane problemy