C#正则表达式表示否定字符类,除非字符相邻

C#正则表达式表示否定字符类,除非字符相邻,c#,regex,regex-negation,regex-lookarounds,C#,Regex,Regex Negation,Regex Lookarounds,我需要匹配字符串中最里面的一组括号之间的字符,但允许使用诸如“()”之类的空括号。尽我所能,这里需要某种消极的前瞻(这与标记为重复的问题完全不同) 未正确包含“()”的初始版本为: 一些测试示例: x (a) y -> a x (a b) y -> a b x (a b c) y -> a b c x (a b() c) y -> a b() c x (a() b() c) y -> a() b() c x (a b

我需要匹配字符串中最里面的一组括号之间的字符,但允许使用诸如“()”之类的空括号。尽我所能,这里需要某种消极的前瞻(这与标记为重复的问题完全不同)

未正确包含“()”的初始版本为:

一些测试示例:

x (a) y          -> a
x (a b) y        -> a b
x (a b c) y      -> a b c
x (a b() c) y    -> a b() c
x (a() b() c) y  -> a() b() c
x (a b() c()) y  -> a b() c()
x (a b(a) c) y   -> a
x (a (b() c)) y  -> b() c
x () y           -> empty

和c#测试方法(适用于您的断言库):

var re=newregex(@“\([^()]+)\);
字符串[]测试={
“x(a)y”、“a”,
“x(AB)y”、“AB”,
“x(abc)y”、“abc”,
“x(ab()c)y”,“ab()c”,
“x(a()b()c)y”,“a()b()c”,
“x(ab()c())y”,“ab()c()”,
“x(a)b(a)c)y”、“a”,
“x(a(b()c))y”,“b()c”,
“x()y”
};
对于(int i=0;i
您可以使用这样的工具:(无需四处寻找)

对正则表达式所做的调整:

在非捕获组中添加了
[^()]
,以及可选的
\(\)
,以便它可以匹配
以外的字符或空括号

或者,如果您不需要捕获组,您可以通过如下方式使用Lookarounds将其删除,并将您的匹配项设置为完全匹配项,而不是组:

(?<=\()(?:[^()]|\(\))+(?=\))

(?您可以使用这样的东西:(不需要环顾四周)

对正则表达式所做的调整:

在非捕获组中添加了
[^()]
,以及可选的
\(\)
,以便它可以匹配
以外的字符或空括号

或者,如果您不需要捕获组,您可以通过如下方式使用Lookarounds将其删除,并将您的匹配项设置为完全匹配项,而不是组:

(?<=\()(?:[^()]|\(\))+(?=\))

(?研究捕获组。一旦你有了那块拼图,你就应该能够适应其余的。@wiktor stribiżew我想你可能遗漏了一些东西。首先,你的正则表达式不是一个有效的答案(参见测试用例)。第二,这是一个与您将其标记为重复的问题截然不同的问题。我如何编辑该问题以使其更清楚?研究捕获组。一旦您有了那块拼图,您就应该能够匹配其余的。@wiktor stribiżew我想您可能遗漏了一些内容。首先,您的正则表达式无效回答(参见测试用例)。第二,这是一个与您将其标记为重复的问题截然不同的问题。我如何编辑该问题以使其更清楚?很好--请参见很好--请参见
(?<=\()(?:[^()]|\(\))+(?=\))