【问题标题】:Regex nested structure with special charaters具有特殊字符的正则表达式嵌套结构
【发布时间】:2020-06-22 06:36:58
【问题描述】:

我需要在 C# 中找到一个匹配并返回由 $( 和 )$ 分隔的嵌套结构中的字符串的正则表达式。

我的输入字符串是:

$(string1$(string2)$sometexthere$(string3$(string4)$texttext)$anothertext)$

输出必须是:

$(string1$(string2)$sometexthere$(string3$(string4)$texttext)$anothertext)$
$(string2)$
$(string3$(string4)$texttext)$
$(string4)$

我已尝试使用此正则表达式 \$\([^\$]*\)\$,但它只返回最内部的 string2string4

有没有办法用正则表达式返回每个匹配项?甚至通过一个循环? ($()$ 可以替换为 [] 之后)

【问题讨论】:

  • 不,正则表达式不能适当地捕获任意嵌套。您可以使用 $( 和 )$ 的正则表达式来拆分,即标记字符串,然后将其处理成树。
  • 我认为方括号内不需要反斜杠。

标签: c# .net regex string parsing


【解决方案1】:

你可以使用

(?=(?<result>\$\((?>[^()]+|(?<o>\()|(?<-o>\)))*(?(o)(?!))\)\$))

查看regex demo,抓住每个match.Groups["result"].Value

C#代码sn-p:

var pattern = @"(?=(?<result>\$\((?>[^()]+|(?<o>\()|(?<-o>\)))*(?(o)(?!))\)\$))";
var results = Regex.Matches(text, pattern)
        .Cast<Match>()
        .Select(x => x.Groups["result"].Value)
        .ToList();

请参阅C# demo online

模式详情

  • (?= - 将启用重叠匹配的正向前瞻:
    • (?&lt;result&gt;\$\((?&gt;[^()]+|(?&lt;o&gt;\()|(?&lt;-o&gt;\)))*(?(o)(?!))\)\$) - 组“结果”:
      • \$\( - $( 子字符串
      • (?&gt;[^()]+|(?&lt;o&gt;\()|(?&lt;-o&gt;\)))* - 除了()( 推入“o”组堆栈或) 从“o”组堆栈弹出0 次或更多次之外,还有1+ 个字符
      • (?(o)(?!)) - 如果组“o”堆栈不为空,则匹配失败的条件
      • \)\$ - )$ 子字符串
  • ) - 前瞻结束

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2022-11-16
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多