正则表达式 - 检查括号/括号是否未关闭(包括嵌套)

时间:2017-02-07 02:13:43

标签: php regex notepad++

我希望在括号/括号未关闭时,或者如果一个已关闭但未打开,包括嵌套(使用notepad ++正则表达式搜索)时匹配。

例如:

[Text](确定)

[Text(不行)

Text](不行)

[Text (test](不行)

[Text test)](不行)

[Text (test)](确定)

如果我可以对{和}做同样的事情,那就太好了。

你可以帮我吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

解析字符串肯定更好,不过,这是一种用Notepad ++完成工作的方法

您必须匹配四个可能的字符串:

1打开括号而不关闭:

^.*?\[(?!.*?\])[^\]]*$

  ^         : begining of string
    .*?     : 0 or more any char, not greedy
    \[      : open bracket
    (?!     : negative lookahead
      .*?   : 0 or more any char, not greedy
      \]    : close braket
    )       : end lookahead
    [^\]]*  : 0 or more any char but close braket
  $         : end of string

2个未打开的近括号:

^[^[\r\n]*\].*?$

  ^         : begining of string
  [^[\r\n]* : O or more any char, except open bracket and linebreak
  \]        : close bracket
  .*?       : 0 or more any char
  $         : end of string

3开括号没有关闭,相同的解释比开括号:

^.*?\((?!.*?\))[^)]*$

4个闭括号没有打开,相同的解释比近括号:

^[^(\r\n]*\).*?$

我允许您对{}执行相同的操作。

将它们放在一起,加上|

^(?:.*?\[(?!.*?\])[^\]]*|[^[\r\n]*\].*?|.*?\((?!.*?\))[^)]*|[^(\r\n]*\).*?)$

答案 1 :(得分:1)

使用正则表达式无法做到这一点:由DFA识别的语言类别(类型3的语言 - Deterministic Finite Automaton)可以由正则表达式表示,但您需要模拟PDA(类型2的语言 - Push Down Automaton)来控制匹配的括号。

它正式证明通过正则表达式无法做到这一点。

一个简单的解决方案是使用初始化为0的计数器:每次找到(时扫描字符串并增加它,或者每次找到)时减少它。< / p>

如果计数器低于零,则表达式不正确。

我建议您只使用一种括号,否则每种类型的括号和一些控制语句都需要一个计数器。