我正在尝试将所有出现的字符“ 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米。
答案 0 :(得分:2)
您将单词m
中的from
与(?=\D)(m|M)
匹配,因为此部分m
使用正向先行,断言右边的不是数字,然后匹配o
。 from
中的[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")))
负向查找,断言右边的字符不是非空格字符
id
答案 1 :(得分:1)
试一试
/(?<!\D\w)(m|M)(?=\s)/g
答案 2 :(得分:0)