Skip to main content
 首页 » 编程设计

c#之带反向引用的正则表达式

2024年02月20日40emanlee

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

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

将匹配“[[反向引用一”、“{值}”和“\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]] 

请您参考如下方法:

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

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

这是一个基本示例,它以基本方式处理部分,但结构是用来添加您的业务逻辑的:

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.