si458
si458

Reputation: 91

how to get string outside brackets within brackets regex

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?

Upvotes: 1

Views: 949

Answers (5)

ArtisticPhoenix
ArtisticPhoenix

Reputation: 21681

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.

Upvotes: 0

Elias Van Ootegem
Elias Van Ootegem

Reputation: 76408

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

Upvotes: 3

Jan
Jan

Reputation: 43199

Yep:

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

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

Upvotes: 0

anubhava
anubhava

Reputation: 786261

In PCRE you can use this recursive regex:

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

RegEx Demo

Upvotes: 0

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627507

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.

Upvotes: 1

Related Questions