如何替换所有出现的字符,除非使用正则表达式将其包含在单词中

时间:2019-04-25 21:04:16

标签: javascript regex

我正在尝试将所有出现的字符“ m”或“ M”替换为“表”,除非它是使用正则表达式的任何单词(如“来自”)的一部分。

我想出的正则表达式最接近我想要的正则表达式:

\(?=\D)(m|M)(?=\W)/g\

但是,它仍然与单词“ from”中的“ m”以及“ 15m”或“ 15 m”中的“ m”相匹配。

预期输出为:

15M -> 15 meters
15m -> 15 meters
15 M -> 15 meters
15 m -> 15 meters
15 M and other words -> 15 meters and other words
15 m and the word from -> 15 meters and the word from
ADM -> ADM
ADM 15m adm 15 M AdM -> ADM 15 meters adm 15 meters AdM
1.5m -> 1.5 meters
45mm -> 45mm

如何使正则表达式仅在不带字符的情况下选择“ m”。感谢所有回复/帮助。

编辑:不好意思,我很抱歉:我正在编辑问题的预期输出部分,以显示使用正则表达式将执行的替换操作。正则表达式也只针对“ m”字符,而忽略它所包含的其余单词或数字。例如15m将在使用正则表达式替换后变成15米。

3 个答案:

答案 0 :(得分:2)

您将单词m中的from(?=\D)(m|M)匹配,因为此部分m使用正向先行,断言右边的不是数字,然后匹配ofrom中的[mM]确实不是数字,所以存在匹配项。

您也可以使用字符类/i或使用不区分大小写的标志((?:^|\s+)\d+\s*)m(?!\S) 来代替替代,而只需使用m。

(
  • (?:^|\s+)捕获组
    • \d+\s*声明字符串的开头或匹配1个以上空格字符
    • )m匹配1+个数字,后跟0+个空格字符
  • (?!\S)关闭捕获组并匹配m
  • let pattern = /((?:^|\s+)\d+\s*)m(?!\S)/gi; [ "15M", "15m", "15 M", "15 m", "15 M", "15 m and the word from", "15 M and other words with 15 meter and 9m is 999mtest", "test200m", ].forEach(s => console.log(s.replace(pattern, "$1meter")))负向查找,断言右边的字符不是非空格字符

Regex demo

id

答案 1 :(得分:1)

试一试

/(?<!\D\w)(m|M)(?=\s)/g

答案 2 :(得分:0)

This RegEx可能有助于捕获 M m ,您可以简单地使用 $ 2 调用它们,这是第二个组:

^([0-9\s]+)(m|M)

此方法的关键是不要从右侧绑定它,而只能从左侧绑定它。

enter image description here