Мені потрібно відповідати символам міжвнутрішній набір дужок в рядку, але дозволяючи порожні парени, такі як "()". Як найкраще я можу сказати, що тут потрібний якийсь негативний погляд (це зовсім інше, ніж питання, для якого він позначений як дублікат)
Початкова версія, яка робить ні правильно включити "()":
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
.
Будь ласка, дайте мені знати, якщо нічого не зрозуміло.