我希望在括号/括号未关闭时,或者如果一个已关闭但未打开,包括嵌套(使用notepad ++正则表达式搜索)时匹配。
例如:
[Text]
(确定)
[Text
(不行)
Text]
(不行)
[Text (test]
(不行)
[Text test)]
(不行)
[Text (test)]
(确定)
如果我可以对{和}做同样的事情,那就太好了。
你可以帮我吗?
谢谢!
答案 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>
如果计数器低于零,则表达式不正确。
我建议您只使用一种括号,否则每种类型的括号和一些控制语句都需要一个计数器。