gpt4 book ai didi

.net - 使用嵌套分隔符解析字符串

转载 作者:行者123 更新时间:2023-12-04 04:46:09 24 4
gpt4 key购买 nike

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

文字:

[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)(?!))
\]
)

Working demo.

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

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

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

你可以做的是:每当你遇到一个左括号时,将它对应的关闭挂件推到捕获堆栈上,而不是打开括号本身。您可以通过前瞻来做到这一点,这样您就不会弄乱您在字符串中的位置。然后,如果当前字符与相应字符匹配(使用简单的反向引用),则仅减少深度计数器。
\G
(?:
[^\[\]]+
|
\[
(?>
[^\[\]()]
|
[(](?=.*(?<Close>[)]))
|
\[(?=.*(?<Close>\]))
|
(?<-Close>\k<Close>)
)*
(?(Close)(?!))
\]
)

Working demo

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

关于.net - 使用嵌套分隔符解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18153185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com