как получить строку вне скобок в скобках регулярное выражение

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

В настоящее время у меня есть это для регулярного выражения

(\\[.*?\\])

что позволяет мне получить все в скобках,

ОДНАКО моя строка имеет двойные скобки

[DATA1[OTHERDATA]RUBBISH]

вывод я получаю

[DATA1[OTHERDATA]

это способ получить полный кронштейн, включая кронштейн внутри?

0

Решение

Держать вещи красивыми и простыми. Жадная спичка должна сделать свое дело:

/\[(.+)\]/

.+ будет соответствовать любому персонажу, но остановится на последнем ]так что матч будет «DATA1 [другие данные] МУСОР»

демонстрация

Разбивка действительно проста:

  • \[: Соответствует буквальному [
  • (.+): Сопоставить (и перехватить) все символы, включая открывающие и закрывающие скобки
  • \]: Совпадение буквального ]

Независимо от того, сколько вложенных скобок у вас есть, результаты одинаковы:

[data[foo][bar][eve[n]]more]
//match:
data[foo][bar][eve[n]]more
3

Другие решения

Вы можете использовать рекурсивное регулярное выражение, как

\[(?:[^][]++|(?R))*]

Увидеть regex demo

подробности:

  • \[ — буквальное открытие [
  • (?:[^][]++|(?R))* — одна или несколько последовательностей:
    • [^][]++ — 1 или более символов, кроме [ а также ] (соответствует притяжательно)
    • | — или же
    • (?R) — повторить всю схему
  • ] — буквальная закрывающая скобка.
1

В PCRE вы можете использовать это рекурсивное регулярное выражение:

$re = '/(
\[
(
(?:[^][]+|(?1))*
)
\]
)/x';

RegEx Demo

0

Ага:

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

Это использует рекурсивное регулярное выражение, см. демо на regex101.com.

0

Попробуйте это, это делает соответствующие скобки (рекурсивно)

 preg_match('/\[(?:[^\[\]]*+|(?0))*\]/', $string, $match );

Показанный здесь

https://regex101.com/r/oL4kH5/2

Например, учитывая это

  [DATA1[OTHERDATA]RUBBISH] hello [something]

Вы получите эти 2 матча

  [DATA1[OTHERDATA]RUBBISH]

[something]

Он также будет различать соответствующие скобки, например:

 [DATA1[OTHERDATA]RUBBISH[hello] hello [something]

вернет 3 матча

 [OTHERDATA]

[hello]

[something]

Это потому, что первая скобка не имеет себе равных.

0
По вопросам рекламы [email protected]