Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有特殊字符的正则表达式嵌套结构_C#_.net_Regex_String_Parsing - Fatal编程技术网

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

C# 具有特殊字符的正则表达式嵌套结构,c#,.net,regex,string,parsing,C#,.net,Regex,String,Parsing,我需要在C#中找到一个正则表达式,它匹配并返回由$(and)$分隔的嵌套结构中的字符串 我的输入字符串是: $(string1$(string2)$sometexthere$(string3$(string4)$texttext)$anothertext)$ 输出必须是: $(string1$(string2)$sometexthere$(string3$(string4)$texttext)$anothertext)$ $(string2)$ $(string3$(string4)$textt

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

我的输入字符串是:

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

输出必须是:

$(string1$(string2)$sometexthere$(string3$(string4)$texttext)$anothertext)$
$(string2)$
$(string3$(string4)$texttext)$
$(string4)$
我尝试过使用这个正则表达式
\$\([^\$]*\)\$
,但它只返回最内部的
string2
string4

是否有一个解决方案可以返回每个匹配的正则表达式?或者甚至通过一个循环?(
$(
)$
可以在后面替换为
[
]

您可以使用

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

图案细节

  • (?=
    -一个积极的前瞻,将启用重叠匹配:
    • (?\$\((?>[^()]+\(?\())*(?(o)(?!)\)\$)
      -组“结果”:
      • \$\(
        -
        $(
        子字符串
      • (?>[^()]+|(?\()(?\))*
        -1+字符,而不是
        推到“o”组堆栈或
        从“o”组堆栈弹出,0次或更多次
      • (?(o)(?!)
        -如果组“o”堆栈不为空,则匹配失败的条件
      • \)\$
        -a
        )$
        子字符串
  • -前瞻的结束

不,regexp不能适当地捕获任意嵌套。您可以使用regexps对$(和)$进行拆分,即标记字符串,然后将其处理为树。我认为方括号内不需要反斜杠。
var pattern = @"(?=(?<result>\$\((?>[^()]+|(?<o>\()|(?<-o>\)))*(?(o)(?!))\)\$))";
var results = Regex.Matches(text, pattern)
        .Cast<Match>()
        .Select(x => x.Groups["result"].Value)
        .ToList();