使用RegEx查找和替换带有通配符类型搜索的字符串的一部分(同时保留一些文本)

时间:2010-05-10 00:29:58

标签: c# regex replace find wildcard

我正在尝试使用不同的文本替换字符串中的某些文本,同时保留一些文本,而我在执行此操作时遇到了问题。


我的代码是:

StreamReader reader = new StreamReader(fDialog.FileName.ToString());
string content = reader.ReadToEnd();
reader.Close();

/Replace M2 with M3 (this works fine)
content = Regex.Replace(content, "M2", "M3");


我想替换包含此字符串的字符串:

Z0.1G0H1E1

并将其转换为:

G54G43Z.1H1M08
(注意Z值和H值在文本更改前包含相同的数值)


我遇到的麻烦是,当我替换值时,我需要保留第一组文本中的H值和Z值。


例如,

Z0.5 G0的 H5 E1

我需要添加新文本,还要将H5和Z0.5添加回文本中,例如:

G54G43的 Z0.5 H5 M08


但是Z值和H值每次都会不同,所以我需要捕获这些值,并在添加新的G54G43值时将它们重新插入字符串。


有人可以告诉我如何使用Regex.Replace吗?

1 个答案:

答案 0 :(得分:1)

如果字符串只包含序列号 (?) ,则最简单的方法是逐个提取参数,并将它们构建为字符串。 (您可能想为Regex.Match行创建一个函数,它们几乎相同)。此版本不假设Z和H之间的任何顺序:

string s = "Z0.5G0H5E1";
string zValue = Regex.Match(s, @"Z(\d*\.)?\d+").Value;
string hValue = Regex.Match(s, @"H(\d*\.)?\d+").Value;
s = String.Format("G54G43{0}{1}M08", zValue, hValue);

如果您的序列号为 (?) 的字符串,您也可以使用Regex.Replace

string s = "hello world Z0.5G0H5E1 this is a string";
s = Regex.Replace(s, @"(Z(?:\d*\.)?\d+)[^H]*(H(?:\d*\.)?\d+)\w*",
                      "G54G43$1$2M08");

该正则表达式基本上意味着:(Z)(数字)(不是H ...)(H)(数字)(还有一些字母......)