猿问

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

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


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


\(?=\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米。


弑天下
浏览 216回答 3
3回答

眼眸繁星

之所以匹配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")))

慕婉清6462132

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

炎炎设计

此RegEx可能有助于捕获两者M,m并且您可以简单地使用来调用它们$2,这是第二个组:^([0-9\s]+)(m|M)此方法的关键是不要从右侧绑定它,而只能从左侧绑定它。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答