我正在尝试做一个正则表达式,它可以给我以下结果:
文字:
[Add Months([Actual Date], 5)] - Another Text - [Actual Date] - [Cria ocorrencia padrao.Record.Name] - Another Text - [Add Months([Actual Date], 5, [Actual Date])] - [Add Months(Add Days(AddDays([Actual Date], 5), 7), 5, [Actual Date])] - final text
期望的输出:
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)(?!))\])?([^\[\]]*)";
但是不起作用,有人可以给我一盏灯吗?
谢谢。
最佳答案
使用平衡组的通常方法是这样的:
\G
(?:
[^\[\]]+
|
\[
(?>
[^\[\]()]
|
(?<Depth>[(\[])
|
(?<-Depth>[)\]])
)*
(?(Depth)(?!))
\]
)
参见this post详细解释我如何到达那里。请注意,在您的情况下,我添加了 \G
anchor 以确保所有匹配项都是相邻的,并且第一次交替不会意外获取括号的内容。
抱歉,我无法真正破译您的模式 - 自由间距(或在 .NET RegexOptions.IgnorePatternWhitespace
中)有很大帮助。
如果您知道您的输入始终正确嵌套,那么这就是所需要的。如果您的输入可能包含转义的括号/括号或错误嵌套的括号/括号,那么这种模式会给您带来一些不希望的结果,并且您必须更加努力,以确保始终关闭正确的括号。 (请参阅链接演示中的第二行 - 内括号以错误的顺序关闭,但它们仍然匹配。)
您可以做的是:每当您遇到左括号时,将其相应的结束挂件推到捕获堆栈上,而不是左括号本身。您可以通过前瞻来完成此操作,这样就不会弄乱字符串中的位置。然后,如果当前字符与相应的字符匹配(使用简单的反向引用),则只需减少深度计数器。
\G
(?:
[^\[\]]+
|
\[
(?>
[^\[\]()]
|
[(](?=.*(?<Close>[)]))
|
\[(?=.*(?<Close>\]))
|
(?<-Close>\k<Close>)
)*
(?(Close)(?!))
\]
)
当然,这仍然无法处理转义。
关于.net - 使用嵌套分隔符解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18153185/