Wyrażenia regularne Scanner

Odpowiedz Nowy wątek
2013-04-28 12:15
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 :)

Pozostało 580 znaków

2013-04-28 12:26
mućka
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.

Pozostało 580 znaków

2013-04-28 12:40
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'.

edytowany 1x, ostatnio: górek, 2013-04-28 12:41

Pozostało 580 znaków

2013-04-28 13:15
mućka

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

Pozostało 580 znaków

2013-04-28 14:09
mućka
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]+)?)

tak wiem wcześniej nie zwróciłem na to uwagi - górek 2013-04-28 14:29

Pozostało 580 znaków

2013-04-29 07:43
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]);
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2013-04-29 08:06

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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