正则表达式捕获字符并替换为另一个
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_])
.以上是关于正则表达式捕获字符并替换为另一个的主要内容,如果未能解决你的问题,请参考以下文章