Nowe posty

Autor Wątek: wyrażenia regularne  (Przeczytany 8092 razy)

g_r_a_d

  • Gość
wyrażenia regularne
« dnia: 2008-06-09, 00:29:48 »
Witam
Mam następujący problem: potrzebuje, przy pomocy linuxowego polecenia egrep i odpowiednio skonstruowanego wyrażenia regularnego wyciągnąć z pliku tekstowego liczby w zakresie np: od 1 do 127, nie potrafię stworzyć odpowiedniego wyrażenia, czy jest ktoś kto mi pomoże? Z góry dzięki. Pozdrawiam.

zawartość pliku:
Cytuj
2
4
54
23
567
23432
25
948
127
2
231
43
55
90
13

arctgx

  • Gość
wyrażenia regularne
« Odpowiedź #1 dnia: 2008-06-09, 00:43:49 »
Jak zapewne wiesz, egrep (lub rownoważnie grep -E) pozwala podać kilka alternatyw rozdzielonych znanym Ci separatorem.

Wyobraź więc sobie liczby od 1 do 127 jako ciągi cyfr i rozbij sobie sytuację na kilka przypadków. Ponieważ to prawdopodobnie zadanie domowe, przyjemność tę zostawiam Tobie (sam już wpadłem, dzięki za sposobność do kombinowania). Przypadków nie powinno być dużo - mi udało się zrobić to w trzech (a przecież w skrajnym wypadku mógłbyś wypisać 127 alternatyw, w końcu dosłowne cytowanie to też przypadek wyrażenia regularnego ;)).

g_r_a_d

  • Gość
wyrażenia regularne
« Odpowiedź #2 dnia: 2008-06-09, 13:38:24 »
mmmyyyy 127 alternatyw :]
nie ukrywam jest to zadanie domowe ale głowie sie nad tym do jakiegoś czasu, dlatego pozwoliłem sobie na napisanie posta. Dzięki za podpowiedz będę próbował. Dam znać co mi wyszło :)

xavery

  • Gość
wyrażenia regularne
« Odpowiedź #3 dnia: 2008-06-09, 13:43:12 »
Jeśli to nie zadanie domowe na wyrażenia regularne to oczywiście lepiej ten problem rozwiązać przez zwykłe porównanie arytmetyczne. No ale jeśli jest to zadanie domowe to rozwiązania nie załączymy:)
PS. Mnie wyszło wyrażenie regularne także z trzema alternatywami chociaż jedna jest zagnieżdżona. Dobrze by było skonfrontować wyniki i podyskutować, no ale nie będziemy robić łatwych prezentów:)

xavery

  • Gość
wyrażenia regularne
« Odpowiedź #4 dnia: 2008-06-09, 13:48:34 »
Cytat: g_r_a_d
mmmyyyy 127 alternatyw :]
nie ukrywam jest to zadanie domowe ale głowie sie nad tym do jakiegoś czasu,
Jeśli będziesz miał już jakieś choćby częściowe rozwiązanie to oczywiście możesz je załączyć i skonsultować się. Nie załączamy gotowców do przeklejenia ale na pewno pomożemy jeśli sam będziesz próbował dojść do rozwiązania.

g_r_a_d

  • Gość
wyrażenia regularne
« Odpowiedź #5 dnia: 2008-06-09, 13:58:00 »
Cytat: xavery
Jeśli będziesz miał już jakieś choćby częściowe rozwiązanie to oczywiście możesz je załączyć i skonsultować się. Nie załączamy gotowców do przeklejenia ale na pewno pomożemy jeśli sam będziesz próbował dojść do rozwiązania.
już mi się tu podoba :)

arctgx

  • Gość
wyrażenia regularne
« Odpowiedź #6 dnia: 2008-06-09, 14:44:20 »
Nikt z nas nie ma pojęcia czy zapoznałeś się już z działaniem egrepa (man grep, man regex) i potrafisz już tworzyć proste alternatywy, np. napisać wyrażenie, które wyciągnie jedynie dwie liczby: 23, 567 (co trzeba zrobić, by np. liczba 23432 nie wyskoczyła przy okazji?). Jeśli opanujesz prostsze przypadki, dopiero weź się za ten zadaniowy.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
wyrażenia regularne
« Odpowiedź #7 dnia: 2008-06-09, 14:55:23 »
Nie potrzeba 127 alternatyw :P

Od 0 do 9 wpadają wszystkie, tak samo od 10 do 99.
Jeżeli liczba ma 3 cyfry, to pierwsza musi być 1, a kolejne od 00 do 27:
to znaczy ze dla 2. cyfry równej 0 lub 1, trzecia jest dowolna,
a dla 2. cyfry równiej 2 trzecia jest od 0 do 7.

Wystarczy teraz z tego zrobić regexpa pamiętając o dołączeniu ^ i $.

A tak w ogóle: Google( "regexp range number" )

arctgx

  • Gość
wyrażenia regularne
« Odpowiedź #8 dnia: 2008-06-09, 15:07:10 »
Cytat: ultr
Nie potrzeba 127 alternatyw :P

Od 0 do 9 wpadają wszystkie, tak samo od 10 do 99.
Jeżeli liczba ma 3 cyfry, to pierwsza musi być 1, a kolejne od 00 do 27:
to znaczy ze dla 2. cyfry równej 0 lub 1, trzecia jest dowolna,
a dla 2. cyfry równiej 2 trzecia jest od 0 do 7.

Wystarczy teraz z tego zrobić regexpa pamiętając o dołączeniu ^ i $.

A tak w ogóle: Google( "regexp range number" )
Kolega mógł do tego dojść sam. Trochę szkoda odwalać główną robotę za niego. To chyba nie takie trudne dojść po zrobieniu prostszych przypadków. Może nie podałeś kompletnego rozwiązania, ale ideę już ma z głowy, tylko techniczna robota mu została.

g_r_a_d

  • Gość
wyrażenia regularne
« Odpowiedź #9 dnia: 2008-06-09, 15:52:38 »
nie nie proszę nie pisać całego rozwiązana :) podkręciliście mi trochę ambicje :)

a grep'a znam tyle o ile, z wyciąganiem konkretnych zadanych danych nie mam problemu , tylko właśnie zagięło mnie wyciągniecie danych z zadanego zakresu... :)

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
wyrażenia regularne
« Odpowiedź #10 dnia: 2008-06-09, 18:47:57 »
@arctgx

Sorry. Faktycznie wygląda na to, że kolega jest ambitny i może nie potrzebnie to napisałem.

Więc, g_r_a_d, nie czytaj powyższego rozwiązania :)

A na poważnie: da się zrobić to o jedną alternatywę mniej niż napisałem wyżej, więc możesz pokombinować.

arctgx

  • Gość
wyrażenia regularne
« Odpowiedź #11 dnia: 2008-06-09, 18:58:52 »
ultr, możesz zawsze wykasować swojego posta w nadziei że jeszcze nie ujrzał ;)

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
wyrażenia regularne
« Odpowiedź #12 dnia: 2008-06-09, 19:12:15 »
W twoim poście jest cytat z niego :)

arctgx

  • Gość
wyrażenia regularne
« Odpowiedź #13 dnia: 2008-06-09, 19:28:27 »
No tak :)

Swoją drogą, warto czasem skopiować do cytatu czyjąś wypowiedź na wypadek późniejszej edycji.