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

how to get string outside brackets within brackets regex

我需要帮助来尝试让正则表达式与双括号一起工作

目前我有正则表达式

(\[.*?\])

这让我可以将所有内容放在括号内,

但是我的字符串有双括号

[DATA1[OTHERDATA]RUBBISH]

我得到的输出是

[DATA1[OTHERDATA]

有没有办法得到完整的括号,包括里面的括号?

您可以使用像

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

regex demo

详情:

  • \[ - 文字开头 [
  • (?:[^][]++|(?R))* - 一个或多个序列:
    • [^][]++ - [] 以外的 1 个或多个字符(所有格匹配)
    • | - 或
    • (?R) - 递归整个模式
  • ] - 文字右括号。

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

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

RegEx Demo

是的:

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

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

让事情变得美好而简单。贪心匹配应该可以解决问题:

/\[(.+)\]/

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

Demo

分解真的很简单:

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

无论你有多少嵌套括号,结果都是一样的:

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

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

 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]

将 return 3 场比赛

 [OTHERDATA]

 [hello]

 [something]

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