2017-08-28 146 views
0

假設我有一個文檔,我想要捕獲之前或之後有括號的字符串。如何獲取任意數目的括號之間的文本?

例子:This [is] a {{test}} sentence. The (((end))).

所以基本上我想要得到的話istestend

在此先感謝。

+0

您也可以使用'[\ [\ {\(] +(\ w +)\] \} \)] +' – Mohammad

+0

你需要的東西是這樣的:'(?:\ [+ | \ (+ | \ {+)([a-zA-Z] +)(?:\] + | \)+ | \} +)' 請參閱示例:https://regex101.com/r/2fPHIK/1/ – Viktor

+1

澄清需要:1.是否必須匹配開頭的括號? 2.「捕獲在OR之前有括號的字符串」。這是否意味着「結束」)應該導致匹配「結束」? –

回答

1

根據您的病情「字符串之前有括號」 - 任何字都可以用OR或者僅僅跟在某種類型的圓括號之後:

$text = 'This [is] a {{test}} sentence. The (((end))). Some word))'; 
preg_match_all('/(?:\[+|\{+|\(+)(\w+)|(\w+)(?:\]+|\}+|\)+)/', $text, $m); 
$result = array_filter(array_merge($m[1],$m[2])); 

print_r($result); 

輸出:

Array 
(
    [0] => is 
    [1] => test 
    [2] => end 
    [7] => word 
) 
+0

問題是:應該關閉符號匹配開頭的嗎?如何處理「{{test}}」?是匹配'測試'還是'測試')?你的正則表達式給出'測試'的結果,這是 - 不要誤解我 - 沒有錯。 OP不清楚。 –

+0

@mlambrichs。再次閱讀來自問題的描述*在**之前有括號的字符串**在**之後* – RomanPerekhrest

1

你的正則表達式可能是:

[\[{(]((?(?<=\[)[^\[\]]+|(?(?<={)[^{}]+|[^()]+))) 

說明:在需要的if-then-else的建設,以確保開口 '{' 是對一個封閉匹配的 '}' 等

[\[{(]         # Read [, { or (
((?(?<=\[)        # Lookbehind: IF preceding char is [ 
[^\[\]]+        # THEN read all chars unequal to [ and ] 
|          # ELSE 
(?(?<={)        # IF preceding char is { 
[^{}]+         # THEN read all chars unequal to { and } 
|          # ELSE 
[^()]+)))        # read all chars unequal to (and) 

regex101.com

1

試試這個正則表達式:

(?<=\(|\[|{)[^()\[\]{}]+ 

>>>Demo<<<

或這一個:

(?<=\(|{|\[)(?!\(|{|\[)[^)\]}]+ 

>>>Demo<<<

Explantion(對於第一個正則表達式):

  • (?<=\(|\[|{) - 正回顧後 - 尋找一個零長度匹配剛好在前面b雅{[(
  • [^()\[\]{}]+ - 未amoong以下任何字符的一個或多個出現次數:[({})]

解釋(用於第二正則表達式):

  • (?<=\(|\[|{) - 正回顧後 - 查找只是由{[(

  • (?!\(|{|\[) preceeded零長度匹配 - 負先行 - 在先前的步驟中,發現這是剛剛由開口托架前面的位置。這塊正則表達式驗證它沒有跟着另一個開頭括號。因此,匹配剛剛位於最裏面的開放括號之後的位置 - ({[

  • [^)\]}]+ - 一個或多個字符的出現不屬於這些右括號之中 - ]})

+0

同樣在這裏:問題是:關閉符號是否與開始符號匹配?如何處理「{{test}}」?是匹配'測試'還是'測試')?你的正則表達式給出'測試'的結果,這是 - 不要誤解我 - 沒有錯。 OP不清楚。 –

+0

@mlambrichs檢查我的第二個正則表達式。它也涵蓋了這種情況。 – Gurman

+0

不,它不。它明顯地匹配'([[({{ofs)}}}}})))''中的'ofs'。問題是如果這是正確的,或者如果比賽應該是'')'。 –

1

以下代碼適用於我。

<?php 

$in = "This [is] a {{test}} sentence. The (((end)))."; 
preg_match_all('/(?<=\(|\[|{)[^()\[\]{}]+/', $in, $out); 
echo $out[0][0]."<br>".$out[0][1]."<br>".$out[0][2]; 
?> 
相關問題