使用反向引用的.NET正则表达式替换

7

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

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());

每个字符串中都会包含单词“project”吗? - Andy F
我太傻了,我没有仔细阅读你的正则表达式 - 我现在可以看出来它是正确的 :) - Andy F
4个回答

32

谢谢你提醒我如何在替换字符串中编写反向引用的语法,这是我在其他地方找不到的。此外,你提供的第二个参考网站是我常去的备忘和速查网站之一。 - David A. Gray

2

我已经修改了您的代码,使用lookbehind和lookahead只匹配在'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有很多重载,它们的功能略有不同。我使用了这个


1
@TheMethod 哎呀,我在ToString上错过了括号。这就是我在发布代码之前没有实际运行它的后果... - Tharwen
1
哦,我明白了。 .* 正在运行到下一个实例。我们需要一些始终位于字符串之间的东西,以便我们可以停止解析器。也许是空格? - Tharwen
1
@TheMethod 看起来最好使用双引号来停止解析器,因为它们永远不会出现在字符串中。我已经更新了答案,请告诉我是否仍然无法正常工作。 - Tharwen
1
@TheMethod,你能否更新一下你现有的代码到问题中? - Tharwen
1
我更新了代码,使用了预期格式的字符串。看起来正则表达式正在按照预期工作。非常感谢你在这里给我的所有帮助。 - TheMethod
显示剩余7条评论

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")

-3
你可以使用 String.Replace (String, String) 方法,例如:
String.Replace ("someword[1]", "someword[2]")

感谢您的回复。这并不能满足我的需求,因为单词是可变的。我需要做的是捕获方括号中某个单词后面的数字,并用不同的数字替换它。 - TheMethod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接