3

我正在尝试用 C# 编写一个函数,用自定义字符串替换所有出现的正则表达式模式。我需要使用匹配字符串来生成替换字符串,所以我试图循环匹配而不是使用 Regex.Replace()。当我调试我的代码时,正则表达式模式匹配我的 html 字符串的一部分并进入 foreach 循环,但是 string.Replace 函数不会替换匹配项。有谁知道是什么导致这种情况发生?

我的功能的简化版本:-

public static string GetHTML() {
    string html = @"
        <h1>This is a Title</h1>
        @Html.Partial(""MyPartialView"")
    ";

    Regex ItemRegex = new Regex(@"@Html.Partial\(""[a-zA-Z]+""\)", RegexOptions.Compiled);
    foreach (Match ItemMatch in ItemRegex.Matches(html))
    {
        html.Replace(ItemMatch.Value, "<h2>My Partial View</h2>");
    }

    return html;
}
4

5 回答 5

7

string.Replace返回一个字符串值。您需要将其分配给您的 html 变量。请注意,它还会替换所有匹配值的出现,这意味着您可能不需要循环。

html = html.Replace(ItemMatch.Value, "<h2>My Partial View</h2>");

返回一个新字符串,其中当前实例中出现的所有指定字符串都替换为另一个指定字符串。

于 2012-09-27T15:16:46.683 回答
1

您没有重新分配给 html

所以:

html = html.Replace(ItemMatch.Value, "<h2>My Partial View</h2>"); 
于 2012-09-27T15:18:26.023 回答
0

正如其他答案所述,您没有分配结果值。

我要补充一点,您的 foreach 循环没有多大意义,您可以使用内联替换:

Regex ItemRegex = new Regex(@"@Html.Partial\(""[a-zA-Z]+""\)", RegexOptions.Compiled);
html = ItemRegex.Replace(html, "<h2>My Partial View</h2>");
于 2012-09-27T15:20:33.420 回答
0

这个怎么样?这样您就可以使用匹配项中的值替换为?

然而,最大的问题是您没有将替换结果重新分配给 html 变量。

using System;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var html = @"
                            <h1>This is a Title</h1>
                            @Html.Partial(""MyPartialView"")
                        ";

            var itemRegex = new Regex(@"@Html.Partial\(""([a-zA-Z]+)""\)", RegexOptions.Compiled);
            html = itemRegex.Replace(html, "<h2>$1</h2>");

            Console.WriteLine(html);
            Console.ReadKey();
        }
    }
}
于 2012-09-27T15:21:46.893 回答
-2

感觉很傻。该字符串是不可变的,因此我需要重新创建它。

html = html.Replace(ItemMatch.Value, "<h2>My Partial View</h2>");
于 2012-09-27T15:19:39.800 回答