否定字符 class 的 C# 正则表达式,除非字符彼此相邻

C# regex for negated character class unless chars are next to one another

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

正确包含'()'的初始版本是:

var re = new Regex(@"\(([^()]+)\)");

一些测试例子:

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 = new Regex(@"\(([^()]+)\)");

string[] tests = {
    "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", ""
};

for (int i = 0; i < tests.Length; i+=2)
{
    var match = re.Match(tests[i]);
    var result = match.Groups[1].Value;
    Assert.That(result, Is.EqualTo(tests[i + 1]));
}

你可以使用这样的东西:(不需要 Lookarounds)

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

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

在非捕获组中添加了 [^()] 以及替代 |\(\) 以便它可以匹配 [=14= 以外的字符] 和 ) 空括号 ().

Try it online.

或者,如果您不需要捕获组,您可以去掉捕获组,并使用像这样的环视使您的匹配成为完全匹配而不是组:

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

这样,您可以使用 match.Value 而不是 match.Groups[1].Value 直接访问您的比赛。

Here's a demo.

如果有什么不清楚的地方请告诉我。