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
[color=#00ff00][b]juzek@chost[/b][/color][color=#5c5cff][b] ~ $[/b][/color] echo 'apteka
optyka
papryka
opteka
aptyka' |egrep --color=auto '[a|o]pt[e|y]ka'
[color=#ff0000][b]apteka[/b][/color]
[color=#ff0000][b]optyka[/b][/color]
papryka
[color=#ff0000][b]opteka[/b][/color]
[color=#ff0000][b]aptyka[/b][/color]
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
O coś takiego chodzi?
.(?<=a)pteka
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
[b]irkaqq[/b] my question was about matching likewise sounding/looking words. I deliberately used pipe [tt]|[/tt] 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 ;)
[color=green]juzek@chost[/color] ~ $ echo 'apteka
> optyka
> papryka
> opteka
> aptyka' |grep -P --color=auto '(a)?(o)?pt(?(1)e)(?(2)y)ka'
[color=red]apteka
optyka[/color][/quote]
Innymi słowy: jeśli pierwsza grupa się spasuje, to szukamy 'e'.
[b]czadman[/b], 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
Time (s) | Query |
---|---|
0.00007 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00066 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.144.20.66' WHERE u.id=1 |
0.00051 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.144.20.66', 1732396300) |
0.00039 | SELECT * FROM punbb_online WHERE logged<1732396000 |
0.00044 | SELECT topic_id FROM punbb_posts WHERE id=316118 |
0.00209 | SELECT id FROM punbb_posts WHERE topic_id=30069 ORDER BY posted |
0.00060 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=30069 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00078 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=30069 ORDER BY p.id LIMIT 0,25 |
0.00084 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=30069 |
Total query time: 0.00647 s |