/ / C # регулярний вираз для заперечуваного класу символів, якщо символи не розташовані поруч один з одним

C # регулярний вираз для відхиленого класу символів, якщо символи не розташовані поруч один з одним - c #, regex, regex-negation, regex-lookarounds

Мені потрібно відповідати символам міжвнутрішній набір дужок в рядку, але дозволяючи порожні парени, такі як "()". Як найкраще я можу сказати, що тут потрібний якийсь негативний погляд (це зовсім інше, ніж питання, для якого він позначений як дублікат)

Початкова версія, яка робить ні правильно включити "()":

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]));
}

Відповіді:

3 для відповіді № 1

Ви можете використовувати щось на зразок цього: (Відсутність необхідності для перегляду)

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

Коригування вашого регулярного виразу:

Додано [^()] в групі, яка не захоплює, разом з альтернативою |() щоб він міг збігатися або символ, відмінний від ( і ) або порожні дужки ().

Спробуйте його в Інтернеті.

Крім того, ви можете позбутися групи захоплення якщо ви не потребуєте і збігаються в повних відповідностях замість груп за допомогою Lookarounds, подібного до цього:

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

Таким чином, ви можете отримати доступ до своїх матчів безпосередньо за допомогою match.Value замість match.Groups[1].Value.

Ось демонстрація.

Будь ласка, дайте мені знати, якщо нічого не зрозуміло.