Имам някои регулярни изрази, които съвпадат с хомонимите, като tw?oo?
щяха да съвпадат two
, to
, или too
, (Също така съвпада twoo
, но това е добре.
Въпросът ми е, че искам регулярният израз да съответства, ако в края има пунктуация или друг нелафабетичен характер, като to,
или two.
или дори ,too!
, Ако няма нищо в края, това също е добре.
Така че искам да съвпадне tw?oo?
ако няма други символи от всяка страна, или ако има не-азбучни знаци, но не ако има букви около: tomorrow
не трябва да съвпадат.
опитах [^A-Za-z]?tw?oo?[^A-Za-z]?
, но тъй като класовете на героите са по избор, те просто са пропуснати.
Как бих направил това, така че регексът съвпада само с думите, ако са сами или са заобиколени от точка. (пространствата не са проблем, те са били изрязани)
Благодаря!
Отговори:
3 за отговор № 1Използвайте граници на думите b
, Те съвпадат винаги, когато дума дума (w
) и не-дума характер са в съседство:
for (qw/two to tomorrow/) {
say "$_ ", /b(?:two|to|too)b/ ? "matches" : "doesn"t match";
}
изход:
two matches
to matches
tomorrow doesn"t match
редактиране
Промених регекса до /b(?:two|to|too)b/
Това е по-разбираемо от това tw?oo?
и по-правилно от tw?o+
, и задейства оптимизация, който превръща тази част от регенекса в много ефективна държавна машина.