2010-03-04 8 views
6

Hej, próbuję użyć metody Javy useDelimiter na jej klasie Scanner, aby wykonać proste przetwarzanie. Zasadniczo każda linia jest zapis ograniczony przez „|”, więc na przykład:Wyrażenie regularne w celu dopasowania "|"

2 | John Doe 
3 | Jane Doe 
4 | Jackie Chan 

Metoda przyjmuje jako parametr wyrażenie regularne do którego pasuje do. Czy ktoś może podać mi wyrażenie regularne pasujące do | (pionowy pasek oddzielony spacją po obu stronach).

Dzięki, będę wdzięczny!

+1

java musi mieć jakąś funkcję podzielonego ciąg. możesz tego użyć. –

+0

Tak, właśnie to zrobiłem, ale wciąż używam wyrażenia regularnego, aby podzielić ciąg znaków :) –

Odpowiedz

11

Wpadłem na \s\|\s, które w Javie byłoby wyrażone jako "\\s\\|\\s". Nie wiem, czy to jest najlepsze. Nie potrzebuję nic hardcorowego, po prostu coś, co działa, a to wydaje się być :)

Przepraszam za odpowiedź na moje własne pytanie, domyślam się, że po napisaniu go pomógł mi myśleć.

+2

Po prostu bądź ostrożny, '\ s' będzie dowolną białą spacją, włączając' \ t'! Więc możesz chcieć być bardziej konkretny, w zależności od zestawu wejściowego. –

+4

Zgadzam się - chciałbym pójść z '' \\ | "' jako argumentem do użyciaDelimiter –

+0

Ohhh ok, dzięki! Nie wiedziałem, że to może być takie łatwe :) –

0
" \| " 

będzie działać, musisz uciec od wyceny, a |

0

Nie zapomnij dołączyć * dopasować powtarzając bohater

\S*\s*\|\s*[\S\t ]* 

Edited - można użyć po prostu to zbyt .*\|.*

+1

Twoje drugie wyrażenie, '. * \ |. *', Zostawiłoby spacje na zwracanych ciągach ... –

3

Tutaj to fragment kodu, który analizuje ciąg (lub cały plik, skaner akceptuje oba) i wyodrębnia numer i nazwę z każdej linii:

String s = 
    "1 | Mr John Doe\n" + 
    "2 | Ms Jane Doe\n" + 
    "3 | Jackie Chan\n"; 

Pattern pattern = Pattern.compile("(\\d+) \\| ((\\w|\\s)+)"); 
Scanner scan = new Scanner(s); 
while (scan.findInLine(pattern) != null) { 
    MatchResult match = scan.match(); 

    // Do whatever appropriate with the results 
    System.out.printf("N° %d is %s %n", Integer.valueOf(match.group(1)), match.group(2)); 

    if (scan.hasNextLine()) { 
     scan.nextLine(); 
    } 
} 

Ten fragment kodu daje następujący wynik:

N° 1 is Mr John Doe 
N° 2 is Ms Jane Doe 
N° 3 is Jackie Chan 
+0

fajne! split() ma argument wyrażenia regularnego, więc musisz użyć \ | reprezentuje pasek, w ciągu znaków jest "\\ |". – jgmao

Powiązane problemy