带反向引用的正则表达式

时间:2012-10-30 11:42:53

标签: c# regex backreference

我正在尝试在C#应用程序中编写一个正则表达式来查找“{value}”,并在它之前对文本进行反向引用“[[”,并在其之后对文本进行另一次反向引用“ ]]”。例如:

This is some text [[backreference one {value} 
backreference two]]

匹配“[[backreference one”,“{value}”和“\ r \ nbackbackference two]]”。

我尝试了下面的修改版本但没有运气。我相信我缺少单词边界,可能因为我试图找到的文本中的“{”而遇到麻烦。

\[\[(^[\{value\}]+)\{value\}(^\]\]+)\]\]

我不确定是否可以使用正则表达式,但如果它能找到匹配的右括号,那将是理想的,例如以下会找到“[[backreferenc [[e]] one”,“ {value}“和”ba [[ckref [[e]] rence t]] wo]]“:

This is some text [[backreferenc[[e]] one {value} 
ba[[ckref[[e]]rence t]]wo]]

2 个答案:

答案 0 :(得分:3)

您需要使用MatchEvaluator on Regex replace。此外,它还可以通过将匹配分解为命名捕获组来帮助进行匹配评估程序处理,从而使您的生活更轻松。让我解释。

MatchEvaluator的作用是,它允许用C#委托在匹配过程中进行调解,并通过检查捕获的实际匹配来返回匹配发生时应该替换的内容。这样您就可以根据需要进行文本处理。

这是一个基本示例,它以基本方式处理各个部分,但结构是为了添加业务逻辑:

string text = @"This is some text [[Name: {name}]] at [[Address: {address}]].";

Regex.Replace(text,
              @"(?:\[\[)(?<Section>[^\:]+)(?:\:)(?<Data>[^\]]+)(?:\]\])",
              new MatchEvaluator((mtch) =>
              {
                    if (mtch.Groups["Section"].Value == "Name")
                            return "Jabberwocky";

                  return "120 Main";

              }));

Regex Replace的结果是:

This is some text Jabberwocky at 120 Main.

答案 1 :(得分:1)

到你问题的第一部分试试这个:

\[\[(.*)({value})(.*)\]\]