从字符串中捕获两个正则表达式

Capture two regular expression from string

我有包含这个的字符串(其中数字是代表用户 ID 的整数)

  @[calbert](3)
  @[username](684684)

我想我需要以下内容来获取用户名和用户 ID

   \((.*?)\) 

   \[(.*?)])

但是有没有办法同时获得两者?

和PHPreturns,是否可以只得到不带括号的结果(和用户名大小写中的括号)

  Array
    (
[0] => (3)
[1] => 3
     )
\[([^\]]*)\]|\(([^)]*)\)

尝试this.See demo.You需要使用|或operator.This提供正则表达式引擎,如果第一个失败则提供交替捕获组。

https://regex101.com/r/tX2bH4/31

$re = "/\[([^\]]*)\]|\(([^)]*)\)/im";
$str = " @[calbert](3)\n @[username](684684)";

preg_match_all($re, $str, $matches);

或者您可以使用您自己的正则表达式。 \((.*?)\)|\[(.*?)\])

通过积极的后瞻和前瞻断言。

(?<=\[)[^\]]*(?=])|(?<=\()\d+(?=\))
  • (?<=\[) 断言匹配之前必须有 [ 个字符,

  • [^\]]* 匹配任何字符但不匹配 ] 零次或多次。

  • (?=]) 断言匹配后必须跟有 ] 符号。

  • | 调用的逻辑 OR 运算符用于组合两个正则表达式。

DEMO