C# Regex-как удалить несколько парных скобок из строки

Я пытаюсь выяснить, как использовать регулярные выражения C# для удаления всех экземпляров парных скобок из строки. Скобки и текст между ними должны быть удалены. Скобки не всегда в одной строке. Кроме того, они могут быть вложенными скобками. Примером строки будет

This is a (string). I would like all of the (parentheses
to be removed). This (is) a string. Nested ((parentheses) should) also
be removed. (Thanks) for your help.

желаемый результат должен быть следующим:

This is a . I would like all of the . This  a string. Nested  also
be removed.  for your help.

4 ответов


к счастью, .NET позволяет рекурсию в регулярных выражениях (см. Определения Балансирующих Групп):

Regex regexObj = new Regex(
    @"\(              # Match an opening parenthesis.
      (?>             # Then either match (possessively):
       [^()]+         #  any characters except parentheses
      |               # or
       \( (?<Depth>)  #  an opening paren (and increase the parens counter)
      |               # or
       \) (?<-Depth>) #  a closing paren (and decrease the parens counter).
      )*              # Repeat as needed.
     (?(Depth)(?!))   # Assert that the parens counter is at zero.
     \)               # Then match a closing parenthesis.",
    RegexOptions.IgnorePatternWhitespace);

в случае, если кто-то задается вопросом: "счетчик parens" никогда не может опуститься ниже нуля (<?-Depth> потерпит неудачу в противном случае), поэтому, даже если скобки "сбалансированы", но неправильно подобраны (например,()))((()), это регулярное выражение не будет одурачен.

для получения дополнительной информации прочитайте отличную книгу Джеффри Фридля "Освоение Регулярных Выражений" (стр. 436)


вы можете повторно заменить /\([^\)\(]*\)/g с пустой строкой, пока не будет найдено больше совпадений.


обычно это не вариант. Однако у Microsoft есть некоторые расширения стандартных регулярных выражений. Вы можете достичь этого с помощью Конструкции Группирования даже если быстрее кодировать как алгоритм, чем читать и понимать объяснение Microsoft их расширения.


Как насчет этого: Regex Replace, похоже, делает трюк.

string Remove(string s, char begin, char end)
{
    Regex regex = new Regex(string.Format("\{0}.*?\{1}", begin, end));
    return regex.Replace(s, string.Empty);
}


string s = "Hello (my name) is (brian)"
s = Remove(s, '(', ')');

вывод:

"Hello is"