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

How to replace all occurrences of a character unless it is included in a word using regex

我正在尝试使用正则表达式将所有出现的字符 'm' 或 'M' 替换为单词“米”,除非它是 "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

如果前面没有字符,我如何才能使正则表达式仅 select 'm'。所有 responses/help 非常感谢。

编辑:很抱歉没有把一些事情说清楚:我正在编辑问题的预期输出部分,以显示使用正则表达式替换会做什么。此外,正则表达式仅针对 'm' 字符并忽略其所属的单词或数字的其余部分。比如15m用正则替换后就是15米

试试这个

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

This RegEx 可能有助于捕获 Mm 并且您可以简单地使用 调用它们$2,也就是第二组:

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

这个方法的关键是不从右边绑定,只从左边绑定。

你在单词 from 中匹配 m 因为这部分 (?=\D)(m|M) 使用了正向前瞻断言右边的不是数字然后匹配 m. from中的o确实不是数字所以匹配。

您还可以使用字符 class [mM] 或使用不区分大小写的标志 /i 而不是交替,只需使用 m.

((?:^|\s+)\d+\s*)m(?!\S)
  • ( 捕获组
    • (?:^|\s+) 断言字符串的开头或匹配 1+ 个空白字符
    • \d+\s* 匹配 1+ 个数字后跟 0+ 个空白字符
  • )m 关闭捕获组并匹配 m
  • (?!\S) 否定前瞻,断言右边不是非空白字符

Regex demo

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, "meter")))