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

时间:2015-04-06 06:31:38

标签: c# regex replace

我有以下内容:

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

我希望将comma替换为dot,同时保留1和0,但要记住它们在不同情况下会有所不同!它可能是version="2,3"

自作聪明和noob-unworking方式是:

           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(",",".")无法做到

3 个答案:

答案 0 :(得分:5)

你需要这样的正则表达式来找到逗号

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

然后进行重新说明:

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

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

答案 1 :(得分:2)

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

你可以试试这个。参见demo。替换$1.

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

答案 2 :(得分:1)

您可以使用捕获组将数字保留在前面和后面以便更换,以便采用更“传统的方式”:

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

在正则表达式中使用如上所述的parens是创建一个捕获组(因此可以在以后需要时访问匹配的部分),以便在上面,逗号之前和之后的数字将存储在{{1}中分别和$1


但是我决定进一步深入研究一下,如果版本中有多个逗号可以替换,那么我们会考虑这种情况,即文本是$2。实现上述目标实际上是单调乏味的,您必须为每个“类型”版本替换一个。所以这里有一个解决方案,有时被称为其他语言的回调(不是C#开发,但我摆弄lambda函数,它似乎工作:)):

version="1,1,0"

上面给出了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,]*"""中的任何数字和逗号序列,然后将其传递到替换的下一行。

replace获取匹配的文本,将其传递给lambda函数,该函数将其带到函数version="...",其中仅在匹配的部分上执行简单的文本替换。

ideone demo