在PHP脚本中,我应该使用什么正则表达式来检查字符串中不匹配的括号?我想要允许的事情包括:
还行吧)
还行吧)
我想阻止的事情:
这是不好的(
这也是(糟糕的
这是(糟糕的)
谢谢!
更新:你们都摇滚.使用正则表达式执行此操作似乎比应有的更复杂,而这些二级答案是使stackoverflow美观的原因.感谢链接和伪代码.我不确定是谁给出了答案,所以我向每个答案我不能接受的人道歉.
正则表达式不适合这项工作.手动扫描字符串.
伪代码:
depth = 0 for character in some_string: depth += character == '(' depth -= character == ')' if depth < 0: break if depth != 0: print "unmatched parentheses"
您可以使用正则表达式执行此操作 - PHP使用的PCRE允许递归模式.PHP手册提供了一个几乎完全符合您要求的示例:
\(((?>[^()]+)|(?R))*\)
这匹配任何正确的带括号的子字符串,只要它以括号开头和结尾.如果你想确保整个字符串是平衡的,允许像"wiggedy(wiggedy)(wiggedy(wack))"这样的字符串,这就是我想出的:
^((?:[^()]|\((?1)\))*+)$
这里的图案,其可以是比混淆更多照明的解释:
^ Beginning of the string ( Start the "balanced substring" group (to be called recursively) (?: Start the "minimal balanced substring" group [^()] Minimal balanced substring is either a non-paren character | or \((?1)\) a set of parens containing a balanced substring ) Finish the "minimal balanced substring" group * Our balanced substring is a maximal sequence of minimal balanced substrings + Don't backtrack once we've matched a maximal sequence ) Finish the "balanced substring" pattern $ End of the string
有很多的效率和正确性的考虑,即拿出这些类型的正则表达式的.小心.
使用正则表达式无法实现此目的.大括号匹配需要递归/计数功能,这在正则表达式中是不可用的.你需要一个解析器.
更多详细信息,请访问:http://blogs.msdn.com/jaredpar/archive/2008/10/15/regular-expression-limitations.aspx