Если вы не используете .NET, lookbehind должны иметь фиксированную длину. Так как вы просто хотите, чтобы обнаружить, есть ли какая-либо несогласованные закрывающие скобки, вы на самом деле не нужен, хотя назад ':
^[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*\]
Если это соответствует у вас есть непревзойденная закрывающая скобка.
Это немного легче понять, если вы понимаете, что [^\[\]]
является инвертированный символьный класс, который соответствует ничего, кроме квадратных скобок, и если вы положите его в freespacing режиме:
^ # start from the beginning of the string
[^\[\]]* # match non-bracket characters
(?: # this group matches matched brackets and what follows them
\[ # match [
[^\[\]]* # match non-bracket characters
\] # match ]
[^\[\]]* # match non-bracket characters
)* # repeat 0 or more times
\] # match ]
Так что пытается найти a ]
после сопоставления 0 или более совпадающих пар скобок.
Обратите внимание, что часть между ^
и ]
функционально эквивалентна решению Тима Пицкера (что, по-моему, немного понятнее концептуально). То, что я сделал, - это метод оптимизации, называемый "unrolling the loop". Если ваш аромат обеспечивает притяжательные квантификаторы, вы можете превратить все *
в *+
, чтобы повысить эффективность еще больше.
О вашей попытке
Даже если вы используете .NET, проблема с рисунком, что .
позволяет пройти другие скобки. Таким образом, вы не получили бы ни одного совпадения в
[abc]def]
Так как первый и второй ]
имеют [
где-то перед ними. Если вы используете .NET, самое простое решение
(?<!\[[^\[\]]*)\]
Здесь мы используем без скобок символы в повторении, так что мы не смотрим мимо первого [
или ]
мы встречаем слева.
который regex аромат вы используете? –
Я пытаюсь проверить RegExr, но я не знаю, какой движок он использует. Я буду применять его либо с Java, либо с Python –
Это использует аромат ECMAScript, реализованный ActionScript. Лучше используйте тестер, который использует аромат, который вы, в конце концов, будете использовать, например http://www.regexplanet.com/ –