Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Elo.
Od jakiegoś czasu ostro przysiadłem nad wyrażeniami regularnymi, bo okazuje się że nie taki diabeł straszny, a do tego ratuje dupę w wielu sytuacjach ^_^
Otwieram szafę i gadam do rzeczy.
Idąc dzisiaj ulicą (tak tak, za firewallem) zauważyłem witryny optyka i apteki. Pomyślałem jakby najlepiej zmatchować to jednym regexem, ale w taki sposób żeby słowa były sensowne.
Narazie wymyśliłem jak łapać wszystko, możliwie najkrócej
juzek@chost ~ $ echo 'apteka
optyka
papryka
opteka
aptyka' |egrep --color=auto '[a|o]pt[e|y]ka'
apteka
optyka
papryka
opteka
aptyka
No, myślę że zrozumiale się wyraziłem :P
Chciłbym dopasować 'e' tylko wtedy jesli wczesniej dopasował 'a'.
Jak to zapisać w wyrażeniu regularnym?
Offline
Niestety - wyrażenia regularne mają wiele zalet ale i kilka wad.
W Iconie (język będący prekursorem regexów) zapisanie czegoś takiego byłoby trywialne.
Tu musisz zrobić coś w stylu a.*e - tak na początek.
Offline
hm, Twój regex niczego mi nie łapie. Korzystam z egrepa.
o co chodziło w zamierzeniu?
Offline
[user@komp ~]$ cat > teka.txt optyka opteka apteka aptyka [user@komp ~]$ grep -P '.pt((?<=a..)e|(?<=o..)y)ka' teka.txt optyka apteka [user@komp ~]$
Wyrażenie dopasuje e kiedy na początku będzie a, i dopasuje y kiedy na początku będzie o.
Offline
For such tasks much more useful may be special libraries, like
http://search.cpan.org/dist/String-Approx/Approx.pm
Jestem wpewniona że są podobny w innych językach.
And at all - "fuzzy regex" search results in google.
Offline
About regex itself here - I would use:
egrep --color=auto '[a|o]pt[e|y]ka'
| in [] isn't necessary.
This can be written as:
egrep --color=auto '[ao]pt[ey]ka'
or
egrep --color=auto '(a|o)pt(e|y)ka'
.
[] means set of characters. Any of the character mentioned inside [] will fit. Of course if ^ is not the first character inside [].
[^abc] means all characters except a or b or c.
|means or. We can group expressions using ().
Best regards,
Irina
Offline
Dzękuję bardzo. To miło.
Bot. Spam Bot.
Offline
Niestety nie mam dużo czasu żeby się uczyć. Muszę pracować.
Bylo przyjemne porazmawiać )
Pa!
Offline
irkaqq my question was about matching likewise sounding/looking words. I deliberately used pipe | character to show what i am after ;)
But finally i solved my problem using capture groups and conditional matching. I am wondering now whether it can simplified ;)
juzek@chost ~ $ echo 'apteka
> optyka
> papryka
> opteka
> aptyka' |grep -P --color=auto '(a)?(o)?pt(?(1)e)(?(2)y)ka'
apteka
optyka
Innymi słowy: jeśli pierwsza grupa się spasuje, to szukamy 'e'.
czadman, sorry, irkaqq napisała i nie zauważyłem Twojej odpowiedzi ;) Sprytne :)
Ostatnio edytowany przez lis6502 (2018-04-02 15:03:07)
Offline
Strony: 1