2014-11-17 5 views
1

Я хочу удалить скобки, которые заканчиваются точкой из строки. Я использую регулярные expresion - @"\([^)]+\)\." он работает со строкой, как это - some text (some text) some (text)., после регулярного выражения у меня есть строка - some text (some text) some Но это не работает со строкой, как что - some text (some text) some (text (text) some). Как это исправить?Кронштейны с точками, регулярные выражения

ответ

1

Просто изменить регулярное выражение, как показано ниже, чтобы соответствовать кронштейнами, который заканчивается .

@"\((?:[^()]*\([^()]*\))*[^()]*\)\." 

DEMO

Регулярное выражение: "Как это исправить"

\(      '(' 
(?:      group, but do not capture (0 or more 
         times): 
    [^()]*     any character except: '(', ')' (0 or 
          more times) 
    \(      '(' 
    [^()]*     any character except: '(', ')' (0 or 
          more times) 
    \)      ')' 
)*      end of grouping 
[^()]*     any character except: '(', ')' (0 or more 
         times) 
\)      ')' 
\.      '.' 
+0

Thks много попробовать это –

3

Традиционный ответ: вы не можете. Регулярные выражения не поддерживают отложенные конструкции. Это верно для большинства диалектов регулярных выражений.


Выражение двигатель .NET регулярна однако поддерживает балансировочные группы. С ними вы можете идентифицировать и обрабатывать гнездование.

Чтобы обработать вложенную конструкцию, вы должны определить ее шаблон открытия и закрытия, в вашем случае это скобки ( и ), соответственно.

  • открыт: (?<paren>\()
  • близко: (?<-paren>\))

Придумайте это как своего рода счетчик с именем «скобка», который подсчитывает, когда он встречает ( и отсчитывает, когда он встречает ) (внутренне, это немного другое, но в качестве метафоры это достаточно).

Теперь те два может быть использована для определения содержимого скобок, т.е.

  • либо ничего, кроме круглых скобок: [^()]*
  • или шаблона открытия
  • или закрытия шаблона сверху

или, в одном выражении: (?:[^()]*|(?<paren>\()|(?<-paren>\)))+

Все регулярное выражение должно завершиться неудачей, когда счетчик не равен нулю в конце, т. Е. Скобки не сбалансированы. Чтобы это произошло, используется конструкция (?(paren)(?!)) (это условное, предназначенное для отказа при отсутствии непревзойденного paren).

Ваша законченная выражение выглядит следующим образом (пробелы игнорируются)

\(
    (?: 
    [^()]* 
    |(?<paren>\() 
    |(?<-paren>\)) 
)+ 
    (?(paren)(?!)) 
\)\.$ 

Смотрите вживую: http://regexhero.net/tester/?id=feb992a2-cc5d-497a-9d4a-a10317487e46

Рекомендуемая литература:

+0

Thks много, метод очень интересную –

Смежные вопросы