如何在 C 语言中用正则表达式替换 by pattern#

How to Replace by pattern with Regex in C#

提问人:L. Kvri 提问时间:10/24/2017 更新时间:10/24/2017 访问量:25950

问:

我有一个文本,该文本包含以 # 开头并以 =“” 字符结尾的字符序列。在 # 和 =“” 字符之间只存在字母数字字符,没有空格或 ;字符。 我试图用以下模式找到指定的序列 我的问题是,如何用三个问号字符替换 =“” 字符???在 C# 中?#[A-Za-z0-9]+(="")

先谢谢你。

C# 正则表达式 替换 模式匹配

评论


答:

20赞 Wiktor Stribiżew 10/24/2017 #1

执行所需操作的正确方法是捕获需要保留的部件,并且仅匹配需要替换的部件:

var result = Regex.Replace(s, "(#[A-Za-z0-9]+)=\"\"", "$1???");

请参阅正则表达式演示

在该模式中,和 字母数字字符被捕获到组 1 中,然后借助替换反向引用(也称为组 1 的占位符)重新插入到生成的字符串中。由于是已知长度的字符串,因此可以安全地在 .(#[A-Za-z0-9]+)=""#$1=""?$1

如果您无法控制模式,只需要替换第一组的内容,并且您不知道第 2 组值的长度(事实并非如此,但让我们概括一下),您可以考虑以下方法:

var s = "#Abc=\"\"";
var result = Regex.Replace(s, "#[A-Za-z0-9]+(=\"\")", m=> 
    string.Format("{0}{1}{2}", 
       m.Value.Substring(0, m.Groups[1].Index), // Get the substring up to Group 1 value
       new string('?', m.Groups[1].Length), // Build the string of Group 1 length ?s
       m.Value.Substring(m.Groups[1].Index+m.Groups[1].Length,  m.Value.Length-m.Groups[1].Index-m.Groups[1].Length))); // Append the rest of the match
Console.WriteLine(result);

请参阅此 C# 演示