具有特殊字符的正则表达式嵌套结构
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)$
我已尝试使用此正则表达式 \$\([^\$]*\)\$
,但它只返回最内部的 string2
和 string4
。
有没有办法用正则表达式返回每个匹配项?甚至通过一个循环? ($(
和 )$
可以替换为 [
和 ]
之后)
【问题讨论】:
不,正则表达式不能适当地捕获任意嵌套。您可以使用 $( 和 )$ 的正则表达式来拆分,即标记字符串,然后将其处理成树。 我认为方括号内不需要反斜杠。 【参考方案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。
模式详情
(?=
- 将启用重叠匹配的正向前瞻:
(?<result>\$\((?>[^()]+|(?<o>\()|(?<-o>\)))*(?(o)(?!))\)\$)
- 组“结果”:
\$\(
- $(
子字符串
(?>[^()]+|(?<o>\()|(?<-o>\)))*
- 除了(
和)
或(
推入“o”组堆栈或)
从“o”组堆栈弹出0 次或更多次之外,还有1+ 个字符
(?(o)(?!))
- 如果组“o”堆栈不为空,则匹配失败的条件
\)\$
- )$
子字符串
)
- 前瞻结束
【讨论】:
以上是关于具有特殊字符的正则表达式嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章