2

我正在尝试做一个可以给我以下结果的正则表达式:

文本:

[添加月份([实际日期],5)] - 另一个文本 - [实际日期] - [Cria ocorrencia padrao.Record.Name] - 另一个文本 - [添加月份([实际日期],5,[实际日期]) ] - [Add Months(Add Days(AddDays([Actual Date], 5), 7), 5, [Actual Date])] - 最终文本

期望的输出:

Match 1: [Add Months([Actual Date], 5)]
Match 2:  - Another Text - 
Match 3: [Actual Date]
Match 4:  - 
Match 5: [Cria ocorrencia padrao.Record.Name]
Match 6:  - Another Text - 
Match 7: [Add Months([Actual Date], 5, [Actual Date])]
Match 8:  - 
Match 9: [Add Months(Add Days(AddDays([Actual Date], 5), 7), 5, [Actual Date])]
Match 10: - final text

但我没有成功,我需要完成这项任务。

我正在尝试使用此正则表达式在.Net中使用嵌套模式正则表达式:

string pattern = @"(([^\[\]]*)??)|(\[(?>\[(?<DEPTH>)\](?<-DEPTH>)|.?)*(?(DEPTH)(?!))\])?([^\[\]]*)";

但是不工作,有人可以给我一个灯吗?

谢谢你。

4

2 回答 2

3

使用平衡组的常用方法是:

\G
(?:
  [^\[\]]+
|
  \[
  (?>
    [^\[\]()]
  |
    (?<Depth>[(\[])
  |
    (?<-Depth>[)\]])
  )*
  (?(Depth)(?!))
  \]
)

工作演示。

有关我如何到达那里的详细说明,请参阅这篇文章。请注意,在您的情况下,我添加了\G锚以确保所有匹配项都是相邻的,并且第一次替换不会意外拾取括号的内容。

抱歉,我无法真正解读您的模式 - 自由间距(或在 .NET 中RegexOptions.IgnorePatternWhitespace)有很大帮助。

如果您知道您的输入始终正确嵌套,那么这就是您所需要的。如果您的输入可能包含转义的括号/括号或错误嵌套的括号/括号,那么此模式会给您一些不希望的结果,您必须更加努力,以确保始终关闭正确的括号。(请参阅链接演示中的第二行 - 内括号以错误的顺序关闭,但它们仍然匹配。)

你可以做的是:每当你遇到一个左括号时,将它对应的关闭挂件推到捕获堆栈上,而不是左括号本身。你可以通过前瞻来做到这一点,这样你就不会弄乱你在字符串中的位置。然后,如果当前字符与对应的字符匹配(使用简单的反向引用),则只减少深度计数器。

\G
(?:
  [^\[\]]+
|
  \[
  (?>
    [^\[\]()]
  |
    [(](?=.*(?<Close>[)]))
  |
    \[(?=.*(?<Close>\]))
  |
    (?<-Close>\k<Close>)
  )*
  (?(Close)(?!))
  \]
)

工作演示

当然,这仍然不能处理转义。

于 2013-08-09T18:36:57.870 回答
0

我找到了解决我的问题的模式:\[(?>\[(?<DEPTH>)|\](?<-DEPTH>)|.?)*(?(DEPTH)(?!))\]|([^\[\]]*)

在此文本中:[Add Months([Actual Date], 5)] - 另一个文本 - [Actual Date] - [Cria ocorrencia padrao.Record.Name] - 另一个文本 - [Add Months([Actual Date], 5, [实际日期])] - [添加月份(添加天数(AddDays([实际日期], 5), 7), 5, [实际日期])] - 最终文本

返回我:

Match 1: [Add Months([Actual Date], 5)]
Match 2:  - Another Text - 
Match 3: [Actual Date]
Match 4:  - 
Match 5: [Cria ocorrencia padrao.Record.Name]
Match 6:  - Another Text - 
Match 7: [Add Months([Actual Date], 5, [Actual Date])]
Match 8:  - 
Match 9: [Add Months(Add Days(AddDays([Actual Date], 5), 7), 5, [Actual Date])]
Match 10: - final text
于 2013-08-09T18:48:17.653 回答