Wyrażenia regularne Scanner

Wyrażenia regularne Scanner
górek
  • Rejestracja: dni
  • Ostatnio: dni
0

Hej

Mam plik tekstowy i chciałbym wyginając z niego pewne informacje problem z tym ze zbudowane prze zemnie wyrażenia regularne nie działa to znaczy nie zwraca wszystkich wyników.

Postać pliku:

Kopiuj
 
FIRST_SECTION:
   1  16.47       96.10
   2  16.47       94.44
   3  20.09       92.54
   4  22.39       93.37
   5  25.23       97.24
SECOND_SECTION:
1 0
2 7
3 30
4 16
5 9
6 21

Chciałbym pobrać wszystkie liczby z pierwszej sekcji (z pobieraniem z drugiej sobie poradziłem). Przy założeniach:

  • liczby w pierwszej kolumnie to zawsze int (mogą byc poprzedzone 0 lub wiecej spacji);
  • liczby w drugiej i trzeciej kolumnie moga być wartościami int lub double (poprzedzone jedną lub więcej spacji).
    Moje wyrażenie regularne:
Kopiuj
Scanner s=new Scanner(input);
if(s.findInLine("(.\\d+) *([0-9.]+) *([0-9.]+)")!=null){
  MatchResult result = s.match();
  for(int i=1;i<result.groupCount();i+=3)
     System.out.println(result.group(i)+" "+result.group(i+1)+" "+result.group(i+2));
  continue;
}

oczywiście cały if odbywa sie w pętli :)

  • Rejestracja: dni
  • Ostatnio: dni
0

Wydaje mi sie ze 2. i 3. regex (sa takie same) sa zle, poniewaz np. sama kropka, '3.' lub '.4' spelnia wyrazenie. Powinno byc raczej cos takiego:
[0-9]+(?.[0-9]+)?
czyli:

  1. najpierw 1 lub wiecej cyfr
  2. nastepnie, opcjonalnie:
    a. kropka
    b. 1 lub wiecej cyfr
    Zapis (?. itd oznacza ze nie chcesz uzywac capture groupy, uzywasz nawiasu tylko do grupowania aby na koncu moc dac ?.
    Oczywiscie, w roznych jezykach programowania liczby w stylu '.3' lub '5.' sa rozniez dozwolone, na co powyzsze wyrazenie nie pozwala.
górek
  • Rejestracja: dni
  • Ostatnio: dni
0

Kompilator buntuje się pokazując komunikat:

Kopiuj
Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 17
(\s*\d+) [0-9]+(?\.[0-9]+)? [0-9]+(?\.[0-9]+)?
                 ^

Komunikat jest jasny uzycie "(?." jest nie dopuszczalne. po usunięciu znaku zapytania jest "prawie ok", bo zamiast 2 pozostałych wartości dostaję 'null'.

  • Rejestracja: dni
  • Ostatnio: dni
1

Sorry, to powinno byc: (?:.
I zdaje sie slashe musza byc podwojne w kodzie java, czyli \.

  • Rejestracja: dni
  • Ostatnio: dni
1

Poza tym, pominales capture grupy dla 2 i 3 liczby, dlatego dostajesz null, powinno byc tak:

\s*(\d+)\s+([0-9]+(?:.[0-9]+)?)\s+([0-9]+(?:.[0-9]+)?)

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Można też tak:

Kopiuj
String tokens[] = s.trim().split("\\s+");
if(tokens.length > 2)
{
     ... = Integer.parseInt(tokens[0])
     ... = Double.parseDouble(tokens[1])
     ... = Double.parseDouble(tokens[2]);
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.