2011-07-09 114 views
3

可能重複:
Regex for checking if a string has mismatched parentheses?匹配圓括號用的preg_match()

我想寫一個正則表達式匹配的數字而已,可選擇用括號括起來的字符串(正則表達式必須還要檢查括號是否正確關閉,也就是說,如果它們存在於語法分析中)。 因此,所有的這應被視爲由正則表達式有效: 123(45)6 (123)(456)

我想出了這個使用條件的模式(請注意,我用的空間,以便在x修飾符需要使它忽略空格):

$val = "(123)"; 
$regex = "^((\()? [0-9]+ (?(2)\)))+$"; 
$ret = preg_match("/{$regex}/x", $val, $matches); 

然而儘管它符合以上條件「(123)」正確地,它也匹配低於它不應該: 「(123)45)」(第二數量具有僅限圓括號)

任何人都可以 幫幫我?

注:允許

回答

3

假設括號不能嵌套,您可以通過治療用括號數字,好像他們是一個單一的數字做:

([0-9]|\([0-9]+\))* 
+0

謝謝!我很生氣,因爲當解決方案非常簡短時,我花了很多時間試圖用條件表達式來完成它。 – John

2

假設你需要嵌套的括號,沒有嵌套的括號,你不能做到這一點與正則表達式。但是,可以做的是刪除所有非括號字符(這很簡單),因此您的文本看起來像()()(())。從那裏開始,你只需檢查結果字符串。你所要做的是大致:

for($i=0; $i<strlen($parens); $i++) { 
    $paren = $parens[$i]; 
    if($paren == '(') 
     $level ++; 
    else 
     $level --; 
    if($level < 0) { 
     // not nested correctly 
     break; 
    } 
} 
if($level != 0) // not nested correctly 

希望這有助於:)

+0

PHP手冊說,你可以:http://ch.php.net/manual/en/regexp.reference.recursive.php雖然我同意正則表達式不完全漂亮。 – phant0m

+0

@ phant0m該死的.. –

2

您可以使用此:

^(\d|\(\d+\))+$ 

這假定嵌套的括號不允許。

+0

謝謝,這個作品呢! – John