【问题标题】:Find and Replace a section of a string with wildcard type search using RegEx (while retaining some text)使用 RegEx 使用通配符类型搜索查找和替换字符串的一部分(同时保留一些文本)
【发布时间】:2011-02-17 11:44:47
【问题描述】:

我试图用不同的文本替换字符串中的一些文本,同时保留一些文本,但我遇到了麻烦。


我的代码是:

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.5G0H5E1

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

G54G43Z0.5H5M08


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


有人可以告诉我如何使用 Regex.Replace 做到这一点吗?

【问题讨论】:

  • 我想补充一点:这些规范缺少很多细节,很容易错过你的要求。 G54G4...M08 是固定字符串吗?是作为一个完整的字符串出现,还是作为更多文本的一部分出现? Z之前可以有字符吗?另外,请注意,在第一种情况下您不需要正则表达式,您可以完成 content = content.Replace("M2", "M3");

标签: c# regex replace find wildcard


【解决方案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) (number) (not H...) (H) (number) (some more letters...)

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 2020-01-14
    • 1970-01-01
    • 2014-08-12
    • 2017-06-10
    • 2016-01-19
    • 1970-01-01
    • 2016-07-07
    • 2023-04-04
    相关资源
    最近更新 更多