Мне нужна помощь, чтобы заставить регулярное выражение работать с двойными скобками
В настоящее время у меня есть это для регулярного выражения
(\\[.*?\\])
что позволяет мне получить все в скобках,
ОДНАКО моя строка имеет двойные скобки
[DATA1[OTHERDATA]RUBBISH]
вывод я получаю
[DATA1[OTHERDATA]
это способ получить полный кронштейн, включая кронштейн внутри?
Держать вещи красивыми и простыми. Жадная спичка должна сделать свое дело:
/\[(.+)\]/
.+
будет соответствовать любому персонажу, но остановится на последнем ]
так что матч будет «DATA1 [другие данные] МУСОР»
Разбивка действительно проста:
\[
: Соответствует буквальному [
(.+)
: Сопоставить (и перехватить) все символы, включая открывающие и закрывающие скобки\]
: Совпадение буквального ]
Независимо от того, сколько вложенных скобок у вас есть, результаты одинаковы:
[data[foo][bar][eve[n]]more]
//match:
data[foo][bar][eve[n]]more
Вы можете использовать рекурсивное регулярное выражение, как
\[(?:[^][]++|(?R))*]
Увидеть regex demo
подробности:
\[
— буквальное открытие [
(?:[^][]++|(?R))*
— одна или несколько последовательностей:
[^][]++
— 1 или более символов, кроме [
а также ]
(соответствует притяжательно)|
— или же(?R)
— повторить всю схему]
— буквальная закрывающая скобка.В PCRE вы можете использовать это рекурсивное регулярное выражение:
$re = '/(
\[
(
(?:[^][]+|(?1))*
)
\]
)/x';
Ага:
(\[([^\[\]]|(?R))*\])
Это использует рекурсивное регулярное выражение, см. демо на regex101.com.
Попробуйте это, это делает соответствующие скобки (рекурсивно)
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]
Это потому, что первая скобка не имеет себе равных.