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



我有以下内容:

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

我想用dot代替comma,同时保留1和0,但请记住,它们在不同的情况下是不同的!可能是CCD_ 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(",",".")不能进行

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

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

然后重新粘合:

text = reg.Replace(text, "$1.$2");

您可以使用$1、$2等按顺序引用匹配的组。

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

你可以试试这个。请参阅演示。替换为$1.

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

您也许可以使用捕获组将数字保持在前面和后面,然后用更"传统的方法"进行替换:

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

在正则表达式中使用类似于上面的parens是为了创建一个捕获组(这样以后需要时可以访问匹配的部分),这样在上面的表达式中,逗号之前和之后的数字将分别存储在$1$2中。


但我决定更深入地研究一下,让我们考虑一下如果版本中有多个逗号要替换的情况,即如果文本是version="1,1,0"。实际上,做上述操作会很乏味,并且您必须为每个"类型"的版本进行一次替换。因此,这里有一个解决方案,有时在其他语言中被称为回调(不是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);
}

以上给出了CCD_ 11。

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

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

视频演示

相关内容

最新更新