Подтвердить что ты не робот

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

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

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.
4b9b3361

Ответ 1

К счастью,.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);

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

Для получения дополнительной информации прочитайте книгу Джеффри Фридла [a href= "http://shop.oreilly.com/product/9780596002893.do" rel= "noreferrer" > "Освоение регулярных выражений" (стр. 436)

Ответ 2

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

Ответ 3

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

Ответ 4

Как насчет этого: 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"