想要在Regex.Replace通话期间编码文本

时间:2020-03-05 18:48:29  来源:igfitidea点击:

我有一个需要帮助的正则表达式电话。

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

基本上,将包含在regex范围内的整个文本用粗体标签包装,然后用Html进行包装。在粗体标签之间对文本进行编码。

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

解决方案

回答

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

foreach(Match in Regex.Matches(...))
{
    //do your stuff here
}

回答

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

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

回答

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

回答

这是这里的实现,我曾经从内容中挑选出特殊的替换字符串并将其本地化。

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;
}

从匹配评估器委托中,我们返回要替换的所有内容,因此,在我返回的地方,我们将具有粗体标签和一个编码调用,我的还支持递归,因此需求有些复杂,但是我们可以简化示例需求。

这等效于对匹配项进行迭代并执行部分replace方法作业。它只是为我们节省了一些代码,并且我们可以使用精美的shmancy委托。

回答

有一种非常简单的方法(在.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/zh-cn/library/system.text.regularexpressions.matchevaluator.aspx中查找更多信息