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

时间:2016-09-08 14:31:30

标签: php regex brackets

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

目前我有这个用于正则表达式

(\\[.*?\\])

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

但我的字符串有双括号

[DATA1[OTHERDATA]RUBBISH]

我得到的输出是

[DATA1[OTHERDATA]

是一种获得包括支架内部在内的完整支架的方法吗?

5 个答案:

答案 0 :(得分:3)

保持美好而简单。一场贪婪的比赛应该可以解决这个问题:

/\[(.+)\]/

.+将匹配任何字符,但它会在最后]停止,因此匹配将是“DATA1 [OTHERDATA] RUBBISH”

Demo

细分非常简单:

  • \[:匹配文字[
  • (.+):匹配(并捕获)所有字符 - 包括左右括号
  • \]:匹配文字]

无论您拥有多少嵌套括号,结果都是相同的:

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

答案 1 :(得分:1)

您可以使用像

这样的递归正则表达式
\[(?:[^][]++|(?R))*]

请参阅regex demo

<强>详情:

  • \[ - 文字开头[
  • (?:[^][]++|(?R))* - 一个或多个序列:
    • [^][]++ - 除[]以外的1个或多个字符(占有率)
    • | - 或
    • (?R) - 递归整个模式
  • ] - 一个字面的结束括号。

答案 2 :(得分:0)

在PCRE中,您可以使用此递归正则表达式:

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

RegEx Demo

答案 3 :(得分:0)

是的:

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

这使用递归正则表达式,请参阅a demo on regex101.com

答案 4 :(得分:0)

尝试这个,它匹配括号(递归)

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

这里显示

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

例如给出这个

  [DATA1[OTHERDATA]RUBBISH] hello [something]

您将获得这两场比赛

  [DATA1[OTHERDATA]RUBBISH]

  [something]

它还可以区分匹配的括号,例如:

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

将返回3场比赛

 [OTHERDATA]

 [hello]

 [something]

这是因为第一个括号无法匹配。