使用 preg_match() 匹配括号

Joh*_*ohn 5 php regex pcre preg-match

可能的重复:用于
检查字符串是否有不匹配的括号的正则表达式?

我正在尝试编写一个正则表达式来仅匹配一串数字,可选地用括号括起来(正则表达式还必须检查括号是否正确关闭,即它们是否存在于 pars 中)。因此,所有这些都应该被正则表达式视为有效:1234567 123(45​​)6 (123)(456)

我使用条件模式想出了这个(请注意,我使用空格,因此需要 x 修饰符来使其忽略空格):

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

然而,虽然它正确匹配上面的“(123)”,但它也匹配下面不应该匹配的:“(123)45)”(第二个数字只有右括号)

有人可以帮忙吗?

注意:不允许嵌套括号

Joh*_*ica 3

假设括号不能嵌套,您可以通过将括号括起来的数字视为单个数字来实现此目的:

([0-9]|\([0-9]+\))*
Run Code Online (Sandbox Code Playgroud)