我正在尝试找到所有匹配[
的匹配,除非紧接着是'
或"
。
例如,它会匹配一行bla bla bla [bla bla bla
但不匹配bla bla bla ['bla bla bla
或bla bla bla ["bla bla bla
。
所以,我尝试了以下
\[.+]/[[^'"][.+]
我(错误的)思考是......
\
开始。[.+]
捕获零个或多个字符。/[
转义,然后搜索右侧括号。[^'"]
来查找'
或"
。[.+]
来完成剩下的工作。我真的不想再针对另一种情况再次提出这个问题,并希望得到一个解释,而不是一个可行的正则表达式。
谢谢
答案 0 :(得分:0)
我的意思是
\[[^'"]+
\[
逃脱[
[^'"]+
一次或多次
答案 1 :(得分:0)
你可以在正则表达式中使用负面预测
你可以使用正则表达式
^.*\[(?!['"])
在perl中测试
if($str=~/^.*\[(?!['"])/){
print "match";
}
答案 2 :(得分:0)
编辑:之后,Alan的反馈意见是简化版。
^.*?\[(?!['"]).*
<强> ORIGINAL 强>
这是一个经典的password-validation-style problem。首先,我会给你一个解决方案和演示,然后我会解释,然后我会给你一个更紧凑的解决方案,将两个条件合二为一。
此正则表达式将起作用(请参阅the demo,其中只匹配正确的行):
^(?=.*?\[)(?!.*?\[['"]).*$
它是如何运作的?
这类问题的处方是在一个环视中表达每个条件,然后,当我们满意时,匹配整个字符串(我们最后用.*
第一个条件:该行必须包含[
这由前瞻(?=.*?\[)
表示,它在字符串的这一点断言(因为我们用^
锚定,所以我们可以匹配任意数量的任何字符,然后是{ {1}}
第二个条件:该行不能包含[
这是由负向前瞻['"
表示的,它在字符串中的这一点断言(因为我们用(?!.*?\[['"])
锚定,因此我们无法匹配任何数量的任何字符后跟一个{ {1}}或^
将两个条件合二为一
此正则表达式将两个条件都转换为单个前瞻(see demo):
['
这一次,单一前瞻中存在负面的预测。主要的前瞻说:在字符串的这一点上(因为我们用["
锚定,所以我们可以匹配任意数量的任何字符,后跟一个^(?=.*?\[(?!['"])).*$
,后面没有{{1}或^