C#如何替换比匹配字符串更短的字符串?

时间:2013-11-06 10:09:37

标签: c# regex replace

如何只替换匹配的正则表达式字符串的一部分?我需要找到一些像< >这样的括号里面的字符串。在这个例子中,我需要匹配23个字符,只替换其中的3个字符:

string input = "<tag abc=\"hello world\"> abc=\"whatever\"</tag>";
string output = Regex.Replace(result, ???, "def");
// wanted output: <tag def="hello world"> abc="whatever"</tag>

因此,我需要在abc中找到<tag abc="hello world">或找到<tag abc="hello world">并仅替换abc。正则表达式或C#允许吗?即使我以不同的方式解决问题,是否可以匹配一个大字符串但只替换它的一小部分?

3 个答案:

答案 0 :(得分:1)

我必须查找#NET正则表达式方言,但一般情况下你想要捕获你不想替换的部分并在替换字符串中引用它们。

string output = Regex.Replace(input, "(<tag )abc(=\"hello world\">)", "$1def$2");

另一种选择是使用环视匹配"abc",使其跟在"<tag "之前,并在"="hello world">"之前

string output = Regex.Replace(input, "(?<=<tag )abc(?==\"hello world\")", "def");

答案 1 :(得分:0)

而不是Regex.Replace使用Regex.Match,您可以使用Match对象上的属性来确定匹配发生的位置..然后是常规字符串函数({{1} })可用于替换您想要替换的位。

答案 2 :(得分:0)

使用命名组的工作示例:

string input = @"<tag abc=""hello world""> abc=whatever</tag>";
Regex regex = new Regex(@"<(?<Tag>\w+)\s+(?<Attr>\w+)=.*?>.*?</\k<Tag>>");
string output = regex.Replace(input, match => 
{
    var attr = match.Groups["Attr"];
    var value = match.Value;
    var left = value.Substring(0, attr.Index);
    var right = value.Substring(attr.Index + attr.Length);
    return left + attr.Value.Replace("abc", "def") + right;
});