4

我有一个相当长的字符串,其中包含具有以下格式的子字符串:

project[1]/someword[1]
project[1]/someotherword[1]

字符串中将有大约 10 个这种模式的实例。

我想要做的是能够用不同的替换方括号中的第二个整数。所以字符串看起来像这样:

project[1]/someword[2]
project[1]/someotherword[2]

我认为正则表达式是我需要的。我想出了正则表达式:

project\[1\]/.*\[([0-9])\]

哪个应该捕获组 [0-9] 以便我可以用其他东西替换它。我正在查看 MSDN Regex.Replace() 但我没有看到如何用您选择的值替换捕获的字符串的一部分。任何有关如何实现此目的的建议将不胜感激。非常感谢。

*编辑:*在与@Tharwen 合作后,我改变了一些方法。这是我正在使用的新代码:

  String yourString = String yourString = @"<element w:xpath=""/project[1]/someword[1]""/> <anothernode></anothernode> <another element w:xpath=""/project[1]/someotherword[1]""/>";
 int yourNumber = 2;
 string anotherString = string.Empty;
 anotherString = Regex.Replace(yourString, @"(?<=project\[1\]/.*\[)\d(?=\]"")", yourNumber.ToString());
4

4 回答 4

28

使用 $1, $2 语法替换匹配的组,如下所示:-

csharp> Regex.Replace("Meaning of life is 42", @"([^\d]*)(\d+)", "$1($2)");
"Meaning of life is (42)"

如果您不熟悉 .NET 中的正则表达式,我推荐http://www.ultrapico.com/Expresso.htm

http://www.regular-expressions.info/dotnet.html也有一些好东西供快速参考。

于 2012-07-24T13:11:56.430 回答
2

我已经调整你的使用后向和前瞻来匹配一个数字,它前面是 'project[1]/xxxxx[' 然后是 ']':

(?<=project\[1\]/.*\[)\d(?=\]")

然后,您可以使用:

String yourString = "project[1]/someword[1]";
int yourNumber = 2;
yourString = Regex.Replace(yourString, @"(?<=project\[1\]/.*\[)\d(?=\]"")", yourNumber.ToString());

我想你可能很困惑,因为 Regex.Replace 有很多重载,它们做的事情略有不同。我用过这个

于 2012-07-24T13:18:42.457 回答
0

如果您想在替换之前处理捕获组的值,您必须分离字符串的不同部分,进行修改并将它们重新组合在一起。

string test = "project[1]/someword[1]\nproject[1]/someotherword[1]\n";

string result = string.Empty;
foreach (Match match in Regex.Matches(test, @"(project\[1\]/.*\[)([0-9])(\]\n)"))
{
    result += match.Groups[1].Value;
    result += (int.Parse(match.Groups[2].Value) + 1).ToString();
    result += match.Groups[3].Value;
}

如果您只想逐字替换文本,则更简单:Regex.Replace(test, @"abc(.*)cba", @"cba$1abc").

于 2012-07-24T13:04:40.820 回答
-3

例如,您可以使用 String.Replace (String, String)

String.Replace ("someword[1]", "someword[2]")
于 2012-07-24T12:48:58.263 回答