C# Regex.Replace 匹配相同数量的字符

Posted

技术标签:

【中文标题】C# Regex.Replace 匹配相同数量的字符【英文标题】:C# Regex.Replace match by the same amount of characters 【发布时间】:2019-04-18 18:05:08 【问题描述】:

我想知道如何将未知数量的等号(不少于 2...)的正则表达式匹配替换为相同数量的下划线

到目前为止,我得到了这个:

text = Regex.Replace(text, "(=2,)", ""); 

我应该使用什么作为第三个参数?

编辑:最好是兼容所有语言的正则表达式解决方案

【问题讨论】:

有输入/输出的例子吗?如果您只想替换任何= 符号,只需将每个= 替换为单个_。如果你有===,它将变为___ 但它们必须至少是 2 个连续的等号,1 个等号应该只是一个等号 那么,这是应该提到的问题的重要部分!这就是示例输入/输出有助于确定替换规则的原因。 【参考方案1】:

您可以改用Regex.Replace(String, MatchEvaluator) 并分析数学:

string result = new Regex("(=2,)")
    .Replace(text, match => new string('_', match.ToString().Length)); 

【讨论】:

【参考方案2】:

一个不太明确的答案(就代码清晰度而言):

text = Regex.Replace(text, "=(?==)|(?<==)=", "_");

如果连续有超过 2 个=,那么在每个=,我们会在前面或后面找到一个=

这只有在语言支持look-behind时才有效,包括C#、Java、Python、PCRE...并且不包括javascript

但是,由于您可以在 JavaScript 中将函数传递给 String.replace 函数,因此您可以编写类似于 Alexei Levenkov 的答案的代码。实际上,Alexei Levenkov 的答案适用于多种语言(当然,Java 除外)。

【讨论】:

感谢您的详细解答 @user3160134:不知道你为什么接受我的回答。它比传入替换函数的解决方案更令人困惑。我写这个答案是为了展示,而不是提倡。

以上是关于C# Regex.Replace 匹配相同数量的字符的主要内容,如果未能解决你的问题,请参考以下文章

Regex.Replace 替换空匹配

C#Regex使用匹配值替换

PHP Regex preg_replace 函数仅查找和替换 3 个匹配项中的第一个和最后一个,而不是中间一个

python regex replace

等效于 C++ 中的 Regex.Replace

用于匹配嵌套括号内的特定文本的 C# 正则表达式