Вы можете использовать следующее регулярное выражение для извлечения интересующих строк:
/(?<=\[|\()[^\[\]\(\)]+/x
Для строки
"[21 is a winner](BULK(KIN[1[35]](MARK my man)))"
совпадения с этим регулярным выражением будут "21 is a winner"
, "BULK"
, "KIN"
, "1"
, "35"
и "MARK my man"
.
Регулярное выражение гласит: «соответствуют одному или нескольким (+
) символам, отличным от (^
) этих в строке '[]()'
([^\[\]\(\)]
является классом символов ), которому непосредственно предшествует '('
или '['
((?<=\[|\()
является положительным взглядом позади ).
Следует отметить, что тот же результат получается, если строка имеет несбалансированные скобки или скобки:
"[21 is a winner((BULK]KIN(1[35]](MARK my man[[["
Регулярное выражение может быть написано для подтверждения того, что скобки и скобки сбалансированы (с использованием подвыражений ), но было бы проще проверить это отдельно, если это необходимо. Это можно сделать, создав пустой стек, а затем обработать строку посимвольно, используя следующие правила:
- , если символ '' ' r '[' pu sh это в стек
- , если символ ')', а стек не пустой, а верхний символ - '(', pop '(' off the stock; в противном случае круглые скобки не сбалансированы
- , если символ «]», а стек непустой, а верхний символ «[», pop '[' вне ассортимента; в противном случае скобки не сбалансированы
- , если символ отсутствует в строке "() []", игнорируйте его.
- , если все символы в строке обработаны, скобки и скобки сбалансированы, если и только если стек тогда пуст.
Обратите внимание, что в любой момент времени стек содержит только символы '('
и '['
.