可能重复:
Regex for checking if a string has mismatched parentheses?
我正在尝试编写一个正则表达式来匹配一串数字,可选地括在括号中(正则表达式还必须检查括号是否正确关闭,即,如果它们存在于句子中)。 所以这一切都应该被正则表达式认为是有效的: 1234567 123(45)6 (123)(456)
我使用条件模式想出了这一点(请注意,我使用空格,因此需要使用x修饰符来忽略空格):
$val = "(123)";
$regex = "^( (\()? [0-9]+ (?(2)\)) )+$";
$ret = preg_match("/{$regex}/x", $val, $matches);
然而,虽然它正确匹配上面的“(123)”,但它也匹配下面不应该: “(123)45)”(第二个数字只有右括号)
任何人都可以提供帮助吗?
注意:不允许使用嵌套括号
答案 0 :(得分:3)
假设你需要嵌套的parens,你不能用正则表达式做到这一点。但是,你可以做的是删除所有非括号字符(这很简单),所以你的文字看起来像()()(())
。从那以后,您只需检查结果字符串。你要做的就是:
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
希望这会有所帮助:)
答案 1 :(得分:3)
假设括号不能嵌套,可以通过将括号括起来的数字视为单个数字来实现:
([0-9]|\([0-9]+\))*
答案 2 :(得分:2)
您可以使用:
^(\d|\(\d+\))+$
这假定不允许使用嵌套括号。
答案 3 :(得分:2)
可以使用正则表达式来解决。阅读recursive patterns。