提问人:John 提问时间:7/10/2011 最后编辑:CommunityJohn 更新时间:7/10/2011 访问量:11042
将括号与 preg_match() [duplicate] 匹配
Match parentheses with preg_match() [duplicate]
问:
可能的重复:
用于检查字符串是否具有不匹配的括号的正则表达式?
我正在尝试编写一个正则表达式来仅匹配一串数字,可以选择用括号括起来(正则表达式还必须检查括号是否正确闭合,即它们是否存在于 pars 中)。 因此,所有这些都应该被正则表达式视为有效: 1234567 123(45)6 (123)(456)
我使用条件模式提出了这个问题(请注意,我使用空格,因此需要 x 修饰符才能使其忽略空格):
$val = "(123)";
$regex = "^( (\()? [0-9]+ (?(2)\)) )+$";
$ret = preg_match("/{$regex}/x", $val, $matches);
但是,尽管它正确地匹配了上面的“(123)”,但它也匹配了以下不应该匹配的内容: “(123)45)”(第二个数字只有右括号)
有人可以帮忙吗?
注意:不允许使用嵌套括号
答:
3赞
Gabi Purcaru
7/10/2011
#1
假设您需要嵌套的 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
希望这对:)有所帮助
评论
2赞
phant0m
7/10/2011
PHP手册说你可以: ch.php.net/manual/en/regexp.reference.recursive.php 虽然我同意正则表达式在这方面并不完全漂亮。
3赞
John Kugelman
7/10/2011
#2
假设括号不能嵌套,您可以通过将括号括起来的数字视为单个数字来做到这一点:
([0-9]|\([0-9]+\))*
评论
0赞
John
7/11/2011
谢谢!我很生气,因为我花了很多时间尝试用条件表达式来做到这一点,而解决方案是如此简短和简单。
2赞
Peter O.
7/10/2011
#3
您可以使用以下功能:
^(\d|\(\d+\))+$
这假定不允许使用嵌套括号。
2赞
Emil Vikström
7/10/2011
#4
这可以使用正则表达式来解决。阅读有关递归模式的信息。
评论