我有一些与同音异义词匹配的正则表达式,例如tw?oo?
会匹配two
,to
或too
。 (它也匹配twoo
,但没关系)。
我的问题是,如果末尾有标点符号或其他非字母字符,我希望正则表达式匹配,例如to,
或two.
或甚至,too!
。如果最后什么也没有,那也没关系。
所以我希望它匹配tw?oo?
如果每一方都没有其他字符,或如果有非字母字符,但不如果周围有字母:tomorrow
不匹配。
我尝试了[^A-Za-z]?tw?oo?[^A-Za-z]?
,但由于字符类是可选的,因此我们可以省略它们。
我该如何做,所以正则表达式只匹配单词,如果它们是单独的,或被punctutation包围。 (空格不是问题,它们已经被删除了)
谢谢!
答案 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 ,它将正则表达式的那部分转换为非常有效的状态机。