正则表达式捕获字符并替换为另一个

Posted

技术标签:

【中文标题】正则表达式捕获字符并替换为另一个【英文标题】:Regex Capture Character and Replace with another 【发布时间】:2021-11-10 12:48:34 【问题描述】:

尝试用dot 替换前面有数字的special characters

const time = "17:34:12:p. m.";

const output = time.replace(/\d+(.)/g, '.');
// Expected Output "17.34.12.p. m."
console.log(output);

我编写了正则表达式,它将捕获任何以数字/s 开头的字符。输出也用替换替换数字。有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

你可以使用

const time = "17:34:12:p. m.";
const output = time.replace(/(\d)[\W_]/g, '$1.');
console.log(output);

time.replace(/(\d)[\W_]/g, '$1.') 代码将匹配一个数字并将其捕获到第 1 组中并匹配任何非单词或下划线字符,$1. 替换将放回数字并将: 替换为.

如果您想从[\W_] 中“减去”空白模式,请使用(?:[^\w\s]|_)

考虑检查Check for special characters in string 中的更多特殊字符模式。

【讨论】:

:@wiktor - 它可以是除冒号 (:) 之外的任何字符。这就是我使用dot 的原因。最初我使用了非单词字符\W,不太确定为什么它也替换了数字。 @user12023283 \W 匹配很多字符,除了 ASCII 字母、数字或 _s 之外的任何字符。您没有捕获该数字,并且在替换后它消失了。您捕获了您替换的字符,这是您的主要问题。我明白了,我用 [\W_] 替换了您的 \W,它用于匹配除 ASCII 字母数字字符以外的任何字符。如果您需要从中排除空格,则需要(?:[^\w\s]|_) 哦,好的。知道了。非常感谢您的澄清:)【参考方案2】:

您应该寻找非单词(\w)和非空格(\s)字符并将它们替换为点。

您应该为正则表达式使用一些实时模拟器。例如regex101:https://regex101.com/r/xIStHH/1

const time = "17:34:12:p. m.";

const output = time.replace(/[^\w\s]/g, '.');
// Expected Output "17.34.12.p. m."
console.log(output);

【讨论】:

非常感谢丹尼尔 :) 我想补充一点,[^\w\s] 不匹配下划线,这是一个特定的字符,因为它属于特殊字符(它与 \pP/\pP/u.test('_') 匹配)和单词字符(检查/\w/.test('_'))。因此,当 OP 说“特殊字符”并且您建议 [^\w\s] 时,我认为总是提到 _ 可以通过 [^\w\s]|_ 添加到模式中是很有价值的。或者,(?:(?!\s)[\W_]).

以上是关于正则表达式捕获字符并替换为另一个的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 用捕获的正则表达式模式替换字符串

正则捕获

量词可以用于R中的正则表达式替换吗?

R语言学习13-正则表达式

sed / awk 匹配文件中第二次出现的正则表达式,并替换整行

将匹配字符串中最后出现的点的正则表达式