2015-01-16 67 views
0

正則表達式我有一個包含字符串本(其中數字是表示用戶ID的整數)捕獲兩個從字符串

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

我想我需要以下來獲取用戶名和用戶ID

\((.*?)\) 

\[(.*?)]) 

但是,有沒有辦法一下子得到兩者兼而有之?

和PHP返回,是有可能只能得到結果,而不括號(和用戶名的情況下支架)

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

檢查PHP函數['preg_match_all()'](http://php.net/manual/en/function.preg-match-all.php)和['正則表達式'語法](http://php.net/manual/en/reference.pcre.pattern.syntax.php)。 – axiac

回答

0

通過積極lookbehead和前瞻斷言。

(?<=\[)[^\]]*(?=])|(?<=\()\d+(?=\)) 
  • (?<=\[)斷言這場比賽必須由[字符preceeded,

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

  • (?=])聲明匹配必須後跟]符號。

  • |被調用的邏輯OR運算符用於組合兩個正則表達式。

DEMO

+0

如何只獲取數字,因爲字符串是@ [leesfer](3)(不是),「不是」是匹配嗎? – Callombert

+0

使用'\ d +'。看到更新。 –

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

嘗試this.See demo.You需要使用|或操作員這提供了正則表達式引擎來提供交替的捕獲組,如果第一個失敗。

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

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

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

或者您可以使用自己的烏爾正則表達式。 \((.*?)\)|\[(.*?)\])