C# 正则表达式平衡组

C# 正则表达式平衡组,c#,regex,balancing-groups,C#,Regex,Balancing Groups,我正在尝试匹配字符串中的平衡大括号({})。例如,我想平衡以下几点: if (a == 2) { doSomething(); { int x = 10; } } // this is a comment while (a <= b){ print(a++); } 你很接近 改编自上的第二个答案(我用它作为我的标准“C#/.NET正则表达式引擎中的平衡xxx”答案,如果它对你有帮助,请向上投票!它在过去对我有帮助): var r=new Regex(@“

我正在尝试匹配字符串中的平衡大括号({})。例如,我想平衡以下几点:

if (a == 2)
{
  doSomething();
  { 
     int x = 10;
  }
}

// this is a comment

while (a <= b){
  print(a++);
} 
你很接近

改编自上的第二个答案(我用它作为我的标准“C#/.NET正则表达式引擎中的平衡xxx”答案,如果它对你有帮助,请向上投票!它在过去对我有帮助):

var r=new Regex(@“
[^{}]*#任何非括号的东西。
\{(#第一个'{'+括号)
(?:                 
[^{}]#匹配所有非大括号
|
(?\{)匹配“{”,并捕获到“打开”
|
(?\})匹配“}”,并删除“打开”捕获
)+#如果要允许{},请更改为*
(?(打开)(?!)#如果“打开”堆栈不是空的,则失败!
)\}#最后一个“}”+闭合捕捉括号
“RegexOptions.IgnoreWhitespace);
你很接近了

改编自上的第二个答案(我用它作为我的标准“C#/.NET正则表达式引擎中的平衡xxx”答案,如果它对你有帮助,请向上投票!它在过去对我有帮助):

var r=new Regex(@“
[^{}]*#任何非括号的东西。
\{(#第一个'{'+括号)
(?:                 
[^{}]#匹配所有非大括号
|
(?\{)匹配“{”,并捕获到“打开”
|
(?\})匹配“}”,并删除“打开”捕获
)+#如果要允许{},请更改为*
(?(打开)(?!)#如果“打开”堆栈不是空的,则失败!
)\}#最后一个“}”+闭合捕捉括号
“RegexOptions.IgnoreWhitespace);

对于标准正则表达式来说是不可能的。请参阅:但是C#/.NET支持平衡组,所以这应该是可能的?对于标准正则表达式来说是不可能的。请参阅:但是C#/.NET支持平衡组,所以这应该是可能的?很好。谢谢我只是有一个小问题要解决。在第一个支撑之前,第一个支撑之前,它阅读了很多不相关的线,在第一个支撑之前,第一个支撑之前,它阅读了很多不相关的线,在第一个支撑之前,它阅读了很多不相关的线,在第一个支撑之前,它阅读了很多不相关的线,在第一个支撑之前,第一个支撑之前,这是一种使用这一种方法的方式,这是这是一种使用这一种使用这--var{{{{m=Regex.Regex.匹配(输入,模式(输入,模式,输入,输入,模式)以及(输入,模式);;;,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(^{{{{{{{{{{{{})))))阅读)在)阅读)在)阅读)在)在第一第一第一第一第一第一第一第一个没有阅读大量阅读了很多没有阅读了很多没有阅读了很多不大量的)在第一第一第一第一第一个不无关的阅读了很多不无关无关无关无关的\}“”;//返回True return Regex.IsMatch(“{{{}{}},@”[^{}]*\{(((?:[^{}]})\{(?\}))+((?(open)(?!))\}”);//返回True,应为False@JJS它在最后一个部分返回true,因为它与平衡部分
{{}}
不是整个字符串。如果您想强制它对抗整个字符串,请使用
^
$
锚定模式。很好。谢谢。我只是想解决一个小问题。它在第一个大括号之前读取了很多不相关的行{这是使用这个--var input=“abc{def{123}”Match m=Regex.Matches的一种方法吗我不相信这是工作。它在一个相当简单的案例上失败。在一个相当简单的案例上失败。在一个相当简单的案例上失败。在一个相当简单的案例上失败。在一个相当简单的案例上失败。在一个(输入,输入,模式(输入,模式)(输入,模式)的(输入,模式)的(输入,输入,模式)及(输入,模式)的(输入,模式,模式,模式:::::::::::::::{((((((((((())目前目前目前)的)目前)的)的)及(输入,以及(输入,以及(输入,以及(输入,输入,输入,输入,输入,输入,输入,模式)模式)模式)的)(输入,输入,模式,模式)模式)模式)及(输入,模式,模式,模式)的)(输入,模式)(输入,输入,模式,模式)(输入,模式)(输入,模式)(输入,模式)(输入,模式)(输入,模式,模式)模式{}]{124;(?\{)(?\}))+(?(开放)(?!))\}”);//返回True,应为False@JJS它在最后一个字符串上返回true,因为它匹配的是平衡部分
{{}{}
而不是整个字符串。如果要强制它对抗整个字符串,请使用
^
$
锚定模式
   "[^{}]*" +
   "(" + 
   "((?'Open'{)[^{}]*)+" +
   "((?'Close-Open'})[^{}]*)+" +
   ")*" +
   "(?(Open)(?!))";
var r = new Regex(@"
[^{}]*                  # any non brace stuff.
\{(                     # First '{' + capturing bracket
    (?:                 
    [^{}]               # Match all non-braces
    |
    (?<open> \{ )       # Match '{', and capture into 'open'
    |
    (?<-open> \} )      # Match '}', and delete the 'open' capture
    )+                  # Change to * if you want to allow {}
    (?(open)(?!))       # Fails if 'open' stack isn't empty!
)\}                     # Last '}' + close capturing bracket
"; RegexOptions.IgnoreWhitespace);