具有特殊字符的正则表达式嵌套结构

Posted

技术标签:

【中文标题】具有特殊字符的正则表达式嵌套结构【英文标题】: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

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

【问题讨论】:

不,正则表达式不能适当地捕获任意嵌套。您可以使用 $( 和 )$ 的正则表达式来拆分,即标记字符串,然后将其处理成树。 我认为方括号内不需要反斜杠。 【参考方案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”堆栈不为空,则匹配失败的条件 \)\$ - )$ 子字符串 ) - 前瞻结束

【讨论】:

以上是关于具有特殊字符的正则表达式嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章

具有特殊字符的Javascript正则表达式密码验证

正则表达式匹配具有两个或多个特殊字符的强密码

具有特定特殊字符的用户名的正则表达式

Linux正则表达式详解

学习正则表达式

在 C# 中具有流畅验证的正则表达式 - 如何在密码中不允许空格和某些特殊字符?