为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

弑天下 2021-04-28 13:49:08
我试图将所有出现的字符“ 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 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

之所以匹配m这个单词,from是因为该部分(?=\D)(m|M)使用正向先行,该断言断言右边的不是数字,然后匹配m。该ofrom确实不是一个数字那么有一个匹配。

除了替代之外,您还可以使用字符类[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")))


查看完整回答
反对 回复 2021-05-13
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

试一试

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


查看完整回答
反对 回复 2021-05-13
?
炎炎设计

TA贡献1808条经验 获得超4个赞

此RegEx可能有助于捕获两者Mm并且您可以简单地使用来调用它们$2,这是第二个组:

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

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

//img1.sycdn.imooc.com//609cbe480001560505660321.jpg

查看完整回答
反对 回复 2021-05-13
  • 3 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信