使用 Regex.Replace 保留可以变化的字符

Using Regex.Replace to keep characters that can be vary

我有以下内容:

string text = "version=\"1,0\"";

我想用 dot 替换 comma,同时保留 1 和 0,但请记住它们在不同情况下是不同的!可以是 version="2,3" .

最聪明的笨办法是:

           for (int i = 0; i <= 9; i++)
            {
                for (int z = 0; z <= 9; z++)
                {
                    text = Regex.Replace(text, "version=\"i,z\"", "version=\"i.z\"");
                }
            }

但是当然..它是一个字符串,我不希望 iz 在那里表现得像一个字符串。

我也可以尝试蹩脚但有效的方法:

text = Regex.Replace(text, "version=\"1,", "version=\"1.");
text = Regex.Replace(text, "version=\"2,", "version=\"2.");
text = Regex.Replace(text, "version=\"3,", "version=\"3.");

等等..但它会很蹩脚。

关于如何单独处理这个问题的任何提示?

编辑:我还有其他不想替换的逗号,所以 text.Replace(",",".") 没法替换

(?<=version=")(\d+),

您可以通过 .

尝试 this.See demo.Replace

https://regex101.com/r/sJ9gM7/52

您需要这样的正则表达式来定位逗号

Regex reg = new Regex("(version=\"[0-9]),([0-9]\")");

然后进行替换:

text = reg.Replace(text, ".");

您可以使用$1、$2等依次引用匹配的组。

您也许可以使用捕获组来保留前面和后面的数字,以便以后进行替换,以便更多 'traditional way' 来完成:

string text = "version=\"1,0\"";
var regex = new Regex(@"version=""(\d*),(\d*)""");
var result = regex.Replace(text, "version=\".\"");

在正则表达式中使用像上面这样的parens是为了创建一个捕获组(以便以后需要时可以访问匹配的部分)这样在上面,逗号前后的数字将存储在</code> 和 <code> 分别。


但我决定再深入一点,让我们考虑一下在版本中是否有多个逗号要替换的情况,即如果文本是 version="1,1,0"。执行上述操作实际上很乏味,并且您必须为每个 'type' 版本进行一次替换。所以这里有一个有时在其他语言中称为回调的解决方案(不是 C# 开发人员,但我摆弄了 lambda 函数并且它似乎有效:)):

private static string SpecialReplace(string text)
{
    var result = text.Replace(',', '.');
    return result;
}
public static void Main()
{
    string text = "version=\"1,0,0\"";
    var regex = new Regex(@"version=""[\d,]*""");
    var result = regex.Replace(text, x => SpecialReplace(x.Value));
    Console.WriteLine(result);
}

以上给出version="1.0.0".

"version=""[\d,]*""" 将首先匹配 version="..." 中的任何数字和逗号序列,然后将其传递到下一行进行替换。

替换获取匹配的文本,将其传递给 lambda 函数,后者将其传递给函数 SpecialReplace,其中仅对匹配的部分执行简单的文本替换。

ideone demo