当前位置:  开发笔记 > 编程语言 > 正文

用于检查字符串是否具有不匹配括号的正则表达式?

如何解决《用于检查字符串是否具有不匹配括号的正则表达式?》经验,为你挑选了3个好方法。

在PHP脚本中,我应该使用什么正则表达式来检查字符串中不匹配的括号?我想要允许的事情包括:

还行吧)

还行吧)

我想阻止的事情:

这是不好的(

这也是(糟糕的

这是(糟糕的)

谢谢!

更新:你们都摇滚.使用正则表达式执行此操作似乎比应有的更复杂,而这些二级答案是使stackoverflow美观的原因.感谢链接和伪代码.我不确定是谁给出了答案,所以我向每个答案我不能接受的人道歉.



1> jfs..:

正则表达式不适合这项工作.手动扫描字符串.

伪代码:

depth = 0
for character in some_string:
    depth += character == '('
    depth -= character == ')'
    if depth < 0:
       break

if depth != 0:
   print "unmatched parentheses"



2> Bennett McEl..:

可以使用正则表达式执行此操作 - 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

有很多的效率和正确性的考虑,即拿出这些类型的正则表达式的.小心.


对于一般的正则表达式来说也是如此.在不使用递归的情况下,很容易发生灾难性的回溯.关于正则表达式的最好的事情是它们令人难以置信的力量和灵活性.关于正则表达式最糟糕的事情是它们令人难以置信的力量和灵活性.

3> JaredPar..:

使用正则表达式无法实现此目的.大括号匹配需要递归/计数功能,这在正则表达式中是不可用的.你需要一个解析器.

更多详细信息,请访问:http://blogs.msdn.com/jaredpar/archive/2008/10/15/regular-expression-limitations.aspx

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有