dousi4148
2016-09-08 14:31
浏览 225
已采纳

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

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?

图片转代码服务由CSDN问答提供 功能建议

我需要帮助才能让正则表达式使用双括号

我有正则表达式

 (\\ [。*?\\])
   
 
 

允许 我将所有内容都放在括号内,

但我的字符串有双括号 <前> [DATA1 [OTHERDATA] RUBBISH]

我得到的输出是

  [DATA1 [OTHERDATA] 
   
 \  n 

是否可以获得包含括号内的完整括号?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • duanjiu2701 2016-09-08 14:35
    已采纳

    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
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • doumu5662 2016-09-08 14:35

    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.
    评论
    解决 无用
    打赏 举报
  • dousi4257 2016-09-08 14:35

    In PCRE you can use this recursive regex:

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

    RegEx Demo

    评论
    解决 无用
    打赏 举报
  • douqiaoru2583 2016-09-08 14:35

    Yep:

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

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

    评论
    解决 无用
    打赏 举报
  • douao1854 2016-09-08 14:39

    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.

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题