正则表达式匹配,如果最后有非字母字符,或什么都没有?

时间:2013-08-18 21:25:25

标签: regex perl word

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

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

所以我希望它匹配tw?oo?如果每一方都没有其他字符,如果有非字母字符,但如果周围有字母:tomorrow不匹配。

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

我该如何做,所以正则表达式只匹配单词,如果它们是单独的,或被punctutation包围。 (空格不是问题,它们已经被删除了)

谢谢!

1 个答案:

答案 0 :(得分: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

修改

我根据tobyink的建议将正则表达式更改为/\b(?:two|to|too)\b/。这比tw?oo?更具可读性,并且比tw?o+更正确,并触发 trie optimization ,它将正则表达式的那部分转换为非常有效的状态机。