【发布时间】:2017-02-07 02:13:42
【问题描述】:
我想在括号/括号未关闭时进行匹配,或者如果一个已关闭但未打开,包括嵌套(使用 notepad++ 正则表达式搜索)。
例如:
[Text](好的)
[Text(不行)
Text](不好)
[Text (test](不行)
[Text test)](不行)
[Text (test)](好的)
如果我可以对 { 和 } 做同样的事情,那就太好了。
你能帮帮我吗?
谢谢!
【问题讨论】:
我想在括号/括号未关闭时进行匹配,或者如果一个已关闭但未打开,包括嵌套(使用 notepad++ 正则表达式搜索)。
例如:
[Text](好的)
[Text(不行)
Text](不好)
[Text (test](不行)
[Text test)](不行)
[Text (test)](好的)
如果我可以对 { 和 } 做同样的事情,那就太好了。
你能帮帮我吗?
谢谢!
【问题讨论】:
解析字符串当然更好,不过,这里有一种使用 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]*\).*?)$
【讨论】:
使用正则表达式是不可能的:DFA 识别的语言类别(类型 3 的语言 - Deterministic Finite Automaton)可以用正则表达式表示,但您需要模拟 PDA(类型 2 的语言 - @ 987654322@) 来控制匹配括号。
正式证明不能通过正则表达式来实现。
一个简单的解决方案是使用初始化为0 的计数器:扫描字符串并在每次找到( 时增加它,或者每次找到) 时减少它。
如果计数器低于零,则表达式格式不正确。
我建议你只使用一种类型的括号,否则你需要为每种类型的括号和一些控制语句使用一个计数器。
【讨论】:
( 和)。如果你想匹配更多类型的括号,你有两个解决方案:你可以模拟一个堆栈,或者,如果你不熟悉它,你可以为每种类型取一个计数器并进行适当的控制。