1

我有一些匹配同音异义词的正则表达式,比如tw?oo?匹配two,totoo. (它也匹配twoo,但没关系)。

我的问题是,如果结尾有标点符号或其他一些非字母字符,我希望正则表达式匹配,比如to,ortwo.甚至,too!. 如果最后什么都没有,那也没关系。

tw?oo?因此,如果每边没有其他字符,或者如果有非字母字符,我希望它匹配,如果周围有字母则不匹配:tomorrow不应该匹配。

我试过[^A-Za-z]?tw?oo?[^A-Za-z]?了,但由于字符类是可选的,所以它们只是被省略了。

我将如何做到这一点,所以正则表达式只匹配单词,如果它们是单独的,或者被标点包围。(空格不是问题,它们已经被剪掉了)

谢谢!

4

1 回答 1

3

使用单词边界\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/按照 tobyink 的建议。这比 更易读tw?oo?也更正确tw?o+,并触发了trie 优化,它将正则表达式的那部分转换为一个非常有效的状态机。

于 2013-08-18T21:30:21.813 回答