使用 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\"");
}
}
但是当然..它是一个字符串,我不希望 i
和 z
在那里表现得像一个字符串。
我也可以尝试蹩脚但有效的方法:
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
您需要这样的正则表达式来定位逗号
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
,其中仅对匹配的部分执行简单的文本替换。
我有以下内容:
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\"");
}
}
但是当然..它是一个字符串,我不希望 i
和 z
在那里表现得像一个字符串。
我也可以尝试蹩脚但有效的方法:
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+),
您可以通过 .
您需要这样的正则表达式来定位逗号
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
,其中仅对匹配的部分执行简单的文本替换。