3

如何仅替换匹配的正则表达式字符串的一部分?我需要找到一些括号< >的字符串,例如. 在此示例中,我需要匹配 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# 允许吗?即使我以不同的方式解决问题,是否可以匹配一个大字符串但只替换它的一小部分?

4

3 回答 3

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");
于 2013-11-06T10:17:00.187 回答
0

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

于 2013-11-06T10:13:34.080 回答
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;
});
于 2013-11-06T11:16:20.317 回答