C # регулярное выражение для отрицательного класса символов, если символы не находятся рядом друг с другом - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно сопоставить символы между самым внутренним набором скобок в строке, но разрешить пустые символы скобок, такие как '()'. Насколько я могу судить, здесь нужен какой-то негативный взгляд (и он полностью отличается от вопроса, для которого он помечен как дубликат)

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

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

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете использовать что-то вроде этого: (Нет необходимости в Lookarounds)

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

Корректировки, внесенные в ваше регулярное выражение:

Добавлен [^()] в группу без захвата вместе с альтернативным |\(\), чтобы он мог соответствовать или символу, отличному от ( и ) или пустым скобкам ().

Попробуйте онлайн .

Кроме того, вы можете избавиться от группы захвата , если она вам не нужна и иметьваши совпадения в полных совпадениях вместо групп с использованием Lookarounds, например, так:

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

Таким образом, вы можете получить доступ к вашим матчам напрямую, используя match.Value вместо match.Groups[1].Value.

Вот демоверсия .

Пожалуйста, дайте мне знать, если что-то не ясно.

...