1

我试图在 C# 应用程序中编写一个正则表达式来查找“{value}”,以及对它之前的文本的反向引用到“[[”,以及对它之后的文本的另一个反向引用到“]]” . 例如:

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

将匹配“[[反向引用一”、“{value}”和“\r\n反向引用二]]”。

我尝试过以下修改版本,但没有成功。我相信我缺少单词边界,并且可能因为我试图查找的文本中的“{”而遇到麻烦。

\[\[(^[\{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]]
4

2 回答 2

3

您需要在 Regex replace 上使用 MatchEvaluator。此外,通过将匹配分解为命名的捕获组以帮助匹配评估器处理,这将使您的生活更轻松。让我解释。

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

              }));

正则表达式替换的结果是:

This is some text Jabberwocky at 120 Main.
于 2012-10-30T14:37:07.730 回答
1

对于你问题的第一部分,试试这个:

\[\[(.*)({value})(.*)\]\]
于 2012-10-30T11:56:18.900 回答