用完全匹配替换字符串的一部分

时间:2019-05-30 05:54:49

标签: c# .net

我只想替换与给定文本匹配的字符串的一部分。 我的用例如下:

    var text = "<wd:response><wd:response-data></wd:response-data></wd:response >";
    string result = text.Replace("wd:response", "response");

    /*
     * expecting the below text
      <response><wd:response-data></wd:response-data></response>
     *
     */

我遵循以下答案:

Way to have String.Replace only hit "whole words"

Regular expression for exact match of a string

但是我没有达到我想要的。

请分享您的想法/解决方案。

样本 https://dotnetfiddle.net/pMkO8Q

3 个答案:

答案 0 :(得分:0)

通常,您应该使用知道XML的工作原理和语言合法性的函数来真正地将XML as 解析和处理。正则表达式和其他幼稚的文本操作通常会给您带来麻烦。

也就是说,对于此特定于 问题的非常简单的解决方案,您可以通过以下两个替换操作来实现:

var text = "<wd:response><wd:response-data></wd:response-data></wd:response >";
text.Replace("wd:response>", "response>").Replace("wd:response ", "response ")

(请注意第二个替换参数末尾的空格。)

或者使用类似于"wd:response\s*>"的正则表达式

答案 1 :(得分:0)

您可以捕获字符串wd-response in a capturing group并使用Regex.Replace使用MatchEvaluator进行替换,就像这样。

正则表达式说明-<[/]?(wd:response)[\s+]?>

  • 从字面上匹配<
  • 匹配/,因此匹配?
  • 匹配字符串wd:response,并将其放入()包围的捕获组中
  • 匹配一个或多个可选空白[\s+]?
  • 从字面上匹配>

public class Program
{
    public static void Main(string[] args)
    {
        string text = "<wd:response><wd:response-data></wd:response-data></wd:response >";
        string replacePattern = "response";
        string pattern = @"<[/]?(wd:response)[\s+]?>";
        string replacedPattern = Regex.Replace(text, pattern, match =>
        {
            // Extract the first group
            Group group = match.Groups[1];

            // Replace the group value with the replacePattern
            return string.Format("{0}{1}{2}", match.Value.Substring(0, group.Index - match.Index), replacePattern, match.Value.Substring(group.Index - match.Index + group.Length));
        });
        Console.WriteLine(replacedPattern);
    }
}

输出:

<response><wd:response-data></wd:response-data></response >

答案 2 :(得分:0)

按照.net小提琴获得结果的最简单方法是使用以下替换。

字符串结果= text.Replace(“ wd:response>”,“ response>”);

但是实现这一目标的正确方法是使用XML进行解析