2012-03-06 4 views
2

Входной нитка, как это (только часть): Регулярное выражение для парных скобок

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

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

[[text[[text text TEXT text]] 

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

[[text [text] text TEXT text]] 

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

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

ответ

2

Что делать с незакрытые или отдельные скобки соответствуют вашим требованиям. До тех пор

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

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

+0

вам нужно избежать литерала] в классе char, чтобы быть в безопасности ... – sweaver2112

+0

@ sweaver2112 Вы имеете в виду для общего регулярного выражения в различных реализациях? Выше было протестировано с .NET. –

+0

было бы где-нибудь там, где это могло бы пострадать? ваш шаблон работает, но в regexr это произошло, пока я не убежал.]. это, в конце концов, специальный char и механизм регулярных выражений, возможно, недостаточно умны, чтобы понять это. – sweaver2112

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

матчи [[<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]]], потому что регулярные выражения не может рассчитывать.

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