【问题标题】:Regex - Check a bracket/parenthese is not closed (including nested)正则表达式 - 检查括号/括号是否关闭(包括嵌套)
【发布时间】:2017-02-07 02:13:42
【问题描述】:

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

例如:

[Text](好的)

[Text(不行)

Text](不好)

[Text (test](不行)

[Text test)](不行)

[Text (test)](好的)

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

你能帮帮我吗?

谢谢!

【问题讨论】:

    标签: php regex notepad++


    【解决方案1】:

    解析字符串当然更好,不过,这里有一种使用 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]*\).*?)$
    

    【讨论】:

    • 太棒了,非常感谢,它处理了我所有的案例!我
    【解决方案2】:

    使用正则表达式是不可能的:DFA 识别的语言类别(类型 3 的语言 - Deterministic Finite Automaton)可以用正则表达式表示,但您需要模拟 PDA(类型 2 的语言 - @ 987654322@) 来控制匹配括号。

    正式证明不能通过正则表达式来实现。

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

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

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

    【讨论】:

    • 感谢您的回答。哦,不好:/这是嵌套案例的原因?有没有不考虑的解决方案?
    • 原因来自于形式语言的理论,在我给你链接的页面中有简要说明。最简单的解决方案是我向您展示的解决方案,只使用()。如果你想匹配更多类型的括号,你有两个解决方案:你可以模拟一个堆栈,或者,如果你不熟悉它,你可以为每种类型取一个计数器并进行适当的控制。
    猜你喜欢
    • 2012-09-13
    • 2020-02-14
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多