从string中捕获两个正则表达式

时间:2015-01-16 13:34:49

标签: php regex

我有包含此字符串的字符串(其中数字是表示用户ID的整数)

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

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

   \((.*?)\) 

   \[(.*?)])

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

并且PHP返回,是否可能只获得没有括号的结果(以及用户名中的括号)

  Array
    (
[0] => (3)
[1] => 3
     )

2 个答案:

答案 0 :(得分:3)

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

试试这个。看看demo.You需要使用|或operator.This提供正则表达式引擎,以便在第一个失败时提供交替捕获组。

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

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

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

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

答案 1 :(得分:0)

通过积极的观察和先行断言。

(?<=\[)[^\]]*(?=])|(?<=\()\d+(?=\))
  • (?<=\[)断言匹配必须以[字符开头,

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

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

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

DEMO