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

标签 .net regex

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

文字:

[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/

相关文章:

python - 最Pythonic的方式来搜索文本以找到问题的答案

php - 在 PHP 中查找 HTML "src"元素的 "img"属性的正则表达式

.net - NServiceBus Bus.Send().Register(callback) 不适用于 IIS/Windows Server 2008

c# - 确定挂起的终结器源

c# - Process.Start 打开一个 URL,得到一个异常?

c# - JSON 压缩器/解压缩器工具

.net - 我需要在服务器上安装 Crystal Reports 中的某些内容吗?

ios - swift 中的正则表达式不适用于此示例?

regex - 如何在我想禁止字符而不是允许字符的地方指定特定长度的正则表达式?

javascript - 正则表达式字符串开始/结束/中间一次匹配