Регулярное выражение для парных скобок

Строка ввода выглядит так (только ее часть):

[[Text Text Text]][[text text text]]asdasdasdasda[[asdasdasdasd]]

Я хочу перечислить все совпадения, в которых текст заключен в пару [[ и ]]. Я попробовал несколько шаблонов, но все терпят неудачу, когда незамкнутые [[ или ]] находятся в строке ввода. Например:

[[text[[text text TEXT text]]

Кроме того, что, если в строке ввода существует одна скобка, например:

[[text [text] text TEXT text]]

Я использовал шаблон регулярного выражения:

\[\[[^\[\[]*\]\]

person user1251683    schedule 06.03.2012    source источник


Ответы (2)


\[\[(?:(?!\[\[|\]\]).)*\]\]

соответствует [[<anything>]], где <anything> может не содержать двойных скобок, но все остальное. Возможно, вам потребуется установить параметр DOTALL вашего движка регулярных выражений, чтобы точка соответствовала новой строке.

Он будет соответствовать [[match [this] text]] в

[[don't match this [[match [this] text]] don't match this]]

Пояснение:

\[\[     # Match [[
(?:      # Match...
 (?!     #  (unless we're right at the start of
  \[\[   #   [[
 |       #  or
  \]\]   #   ]]
 )       #  )
 .       # ...any character
)*       # Repeat any number of times
\]\]     # Match ]]

Предостережение: он будет соответствовать [[match [this]] в тексте [[match[this]]], потому что регулярные выражения не могут считаться.

person Tim Pietzcker    schedule 06.03.2012

Что делать с незакрытыми или одинарными скобками, зависит от вашей спецификации. До тех пор

\[\[([^\]]|\][^\]])*\]\]

работает для меня (где все две проблемные строки совпадают.

person Mark Hurd    schedule 06.03.2012
comment
@ sweaver2112 Вы имеете в виду универсальное регулярное выражение для различных реализаций? Вышеупомянутое было протестировано с .NET. - person Mark Hurd; 06.03.2012
comment
было бы где-нибудь, где избежать этого было бы больно? ваш шаблон работает, но в регулярном выражении он не работал, пока я не сбежал]. в конце концов, это специальный символ, и механизм регулярных выражений может быть недостаточно умен, чтобы понять это. - person Scott Weaver; 06.03.2012
comment
Да, я пропустил обратную косую черту для ] после |, и я добавил их и для классов. - person Mark Hurd; 06.03.2012