如何在括号正则表达式中获取括号外的字符串

I need help trying to get regex to work with double brackets

currently i have this for the regex

(\\[.*?\\])

that allows me to get everything inside a bracket,

HOWEVER my string has double brackets

[DATA1[OTHERDATA]RUBBISH]

the output I get is

[DATA1[OTHERDATA]

is the a way of getting the full bracket including the bracket inside?

Keeping things nice and simple. A greedy match should do the trick:

/\[(.+)\]/

the .+ will match any character, but it'll stop at the last ], so the match will be "DATA1[OTHERDATA]RUBBISH"

Demo

Breakdown is really simple:

  • \[: Matches literal [
  • (.+): Match (and capture) all characters - including opening and closing brackets
  • \]: Match literal ]

Regardless of how many nested brackets you have the results are the same:

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

You may use a recursive regex like

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

See the regex demo

Details:

  • \[ - a literal opening [
  • (?:[^][]++|(?R))* - one or more sequences of:
    • [^][]++ - 1 or more chars other than [ and ] (matched possessively)
    • | - or
    • (?R) - recurse the whole pattern
  • ] - a literal closing bracket.

In PCRE you can use this recursive regex:

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

RegEx Demo

Yep:

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

This uses a recursive regex, see a demo on regex101.com.

Try this one, it does matched brackets ( recursively )

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

Shown here

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

For example given this

  [DATA1[OTHERDATA]RUBBISH] hello [something]

You will get these 2 matches

  [DATA1[OTHERDATA]RUBBISH]

  [something]

It will also differentiate between matched brackets, for example:

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

will return 3 matches

 [OTHERDATA]

 [hello]

 [something]

This is because the first bracket is unmatched.