如何替换所有出现的字符,除非它包含在使用正则表达式的单词中
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 可能有助于捕获 M 和 m 并且您可以简单地使用 调用它们$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)
否定前瞻,断言右边不是非空白字符
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")))
我正在尝试使用正则表达式将所有出现的字符 '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 可能有助于捕获 M 和 m 并且您可以简单地使用 调用它们$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)
否定前瞻,断言右边不是非空白字符
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")))