想要在Regex.Replace调用期间编码文本

时间:2008-09-05 19:41:31

标签: regex

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

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

基本上,使用粗体标记包装正则表达式范围内的整个文本,还要在粗体标记之间插入Html.Encode文本。

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

5 个答案:

答案 0 :(得分: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

了解详情

答案 1 :(得分:3)

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

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

答案 2 :(得分: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委托。

答案 3 :(得分:0)

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

您可以使用它来拼接粗体标签并在那里进行编码。

答案 4 :(得分:0)

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