我试图将所有出现的字符“ m”或“ M”替换为“ meters”,除非它是使用正则表达式的任何单词(如“ from”)的一部分。我想出的正则表达式与我想要的最接近的正则表达式是:\(?=\D)(m|M)(?=\W)/g\但是,它仍然与单词“ from”中的“ m”以及“ 15m”或“ 15 m”中的“ m”相匹配预期输出为:15M -> 15 meters15m -> 15 meters15 M -> 15 meters15 m -> 15 meters15 M and other words -> 15 meters and other words15 m and the word from -> 15 meters and the word fromADM -> ADMADM 15m adm 15 M AdM -> ADM 15 meters adm 15 meters AdM1.5m -> 1.5 meters45mm -> 45mm如果正则表达式前面没有字符,我该如何使其仅选择“ m”。所有的答复/帮助深表感谢。编辑:很抱歉,没有明确说明:我正在编辑问题的预期输出部分,以显示使用正则表达式进行替换会产生什么。正则表达式也只针对“ m”字符,而忽略它所包含的其余单词或数字。例如15m将在使用正则表达式替换后变为15米。
3 回答
![?](http://img1.sycdn.imooc.com/54584cde0001d19202200220-100-100.jpg)
眼眸繁星
TA贡献1873条经验 获得超9个赞
之所以匹配m
这个单词,from
是因为该部分(?=\D)(m|M)
使用正向先行,该断言断言右边的不是数字,然后匹配m
。该o
中from
确实不是一个数字那么有一个匹配。
除了替代之外,您还可以使用字符类[mM]
或不区分大小写的标志,/i
只需使用m。
((?:^|\s+)\d+\s*)m(?!\S)
(
捕获组(?:^|\s+)
声明字符串的开头或匹配1+个空格字符\d+\s*
匹配1+位数字,后跟0+空格字符)m
关闭捕获组并匹配m(?!\S)
负向查找,断言右边的字符不是非空格字符
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")))
添加回答
举报
0/150
提交
取消