Wyrażenia regularne Scanner

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:

 
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:
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 :)

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.
0

Kompilator buntuje się pokazując komunikat:

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'.

1

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

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]+)?)

0

Można też tak:

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1