正则表达式。如何匹配单词后面跟着并且前面跟着另一个字符

时间:2017-07-26 13:39:35

标签: regex

我想在代码中将mm单位替换为cm单位。在大量此类替换的情况下,我使用regexp

我做了这样的表达:

(?!a-zA-Z)mm(?!a-zA-Z)

但它仍匹配summagammadummy等字词。

如何正确组成正则表达式?

2 个答案:

答案 0 :(得分:4)

使用字符类并将第一个(?!...)前瞻更改为lookbehind:

(?<![a-zA-Z])mm(?![a-zA-Z])
^^^^^^^^^^^^^   ^^^^^^^^^^^ 

请参阅regex demo

模式匹配:

  • (?<![a-zA-Z]) - 如果当前位置的 left 有一个ASCII字母,那么匹配失败的后置
  • mm - 文字子字符串
  • (?![a-zA-Z]) - 如果当前位置的右侧有一个ASCII字母,那么匹配失败前瞻

注意:如果您需要使模式支持Unicode,请将[a-zA-Z]替换为[^\W\d_](如果您使用的是Python,则使用re.U标志.X)。

答案 1 :(得分:2)

没有必要使用前瞻和外观,所以如果你想简化你的模式,你可以尝试这样的事情;

\d+\s?(mm)\b

这确实假设您的毫米符号将始终跟随一个数字,中间有一个可选空格,我认为在这种情况下这是一个合理的假设。

\b检查字边界,以确保mm不属于dummy等单词的一部分。

Demo here