4

我有一个需要帮助的正则表达式调用。

我没有发布我的正则表达式,因为它在这里不相关。我想要做的是,在替换期间,我还想通过对影响正则表达式的整个文本执行 Html.Encode 来修改 ${test} 部分。

基本上,用粗体标记包装正则表达式范围内的整个文本,但也用 Html.Encode 粗体标记之间的文本。

RegexOptions regexOptions = RegexOptions.Compiled | RegexOptions.IgnoreCase;
text = Regex.Replace(text, regexBold, @"<b>${text}</b>", regexOptions);
4

5 回答 5

4

有一种非常简单的方法可以做到这一点(在.net中)。它被称为 MatchEvaluator,它可以让您进行各种酷查找和替换。本质上,您只需向 Regex.Replace 方法提供一个方法的方法名称,该方法返回一个字符串并将 Match 对象作为其唯一参数。为您的特定匹配(html 编码)做任何有意义的事情,您返回的字符串将替换输入字符串中匹配的整个文本。

示例:假设您想查找添加了两个数字的所有位置(在文本中),并且您想用实际数字替换表达式。您不能使用严格的正则表达式方法来做到这一点,但是当您输入 MatchEvaluator 时,它会变得很容易。

public void Stuff()
{
    string pattern = @"(?<firstNumber>\d+)\s*(?<operator>[*+-/])\s*(?<secondNumber>\d+)";
    string input = "something something 123 + 456 blah blah 100 - 55";
    string output = Regex.Replace(input, pattern, MatchMath);
    //output will be "something something 579 blah blah 45"
}

private static string MatchMath(Match match)
{
    try
    {
        double first = double.Parse(match.Groups["firstNumber"].Value);
        double second = double.Parse(match.Groups["secondNumber"].Value);
        switch (match.Groups["operator"].Value)
        {
            case "*":
                return (first * second).ToString();
            case "+":
                return (first + second).ToString();
            case "-":
                return (first - second).ToString();
            case "/":
                return (first / second).ToString();
        }
    }
    catch { }
    return "NaN"; 
}

在http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchevaluator.aspx了解更多信息

于 2008-09-05T20:17:01.107 回答
3

在这种情况下不要使用 Regex.Replace ......使用......

foreach(Match in Regex.Matches(...))
{
    //do your stuff here
}
于 2008-09-05T19:43:12.610 回答
2

这是我用来从内容中挑选出特殊替换字符串并将它们本地化的一个实现。

        protected string FindAndTranslateIn(string content)
        {
            return Regex.Replace(content, @"\{\^(.+?);(.+?)?}", new MatchEvaluator(TranslateHandler), RegexOptions.IgnoreCase);
        }

public string TranslateHandler(Match m)
{
    if (m.Success)
    {
        string key = m.Groups[1].Value;
        key = FindAndTranslateIn(key);
        string def = string.Empty;
        if (m.Groups.Count > 2)
        {
            def = m.Groups[2].Value;
            if(def.Length > 1)
            {
                def = FindAndTranslateIn(def);
            }
        }

        if (group == null)
        {
            return Translate(key, def);
        }
        else
        {
            return Translate(key, group, def);
        }
    }
    return string.Empty;
}

从匹配评估器委托中,您返回要替换的所有内容,因此在我返回的地方,您将有粗体标签和编码调用,我的也支持递归,因此对于您的需求来说有点过于复杂,但您可以缩减示例您的需求。

这相当于对匹配集合进行迭代并执行部分替换方法工作。它只是为您节省了一些代码,并且您可以使用花哨的 shmancy 委托。

于 2008-09-05T20:04:33.430 回答
0

如果您执行 Regex.Match,则在第 0 个索引处生成的匹配对象组是匹配正则表达式的输入的子集。

您可以使用它来缝合粗体标签并在那里对其进行编码。

于 2008-09-05T19:44:03.653 回答
0

能否在 {} 中填写代码以添加粗体标签,并对文本进行编码?我对如何将更改应用于整个文本块并在最后替换文本变量中的部分感到困惑。

于 2008-09-05T19:56:38.443 回答