使用RegEx匹配字符,除非“立即”后跟另一个特定字符

时间:2014-05-20 03:15:32

标签: regex linux

我正在尝试找到所有匹配[的匹配,除非紧接着是'"

例如,它会匹配一行bla bla bla [bla bla bla但不匹配bla bla bla ['bla bla blabla bla bla ["bla bla bla

所以,我尝试了以下

\[.+]/[[^'"][.+]

我(错误的)思考是......

  1. 使用\开始。
  2. 使用[.+]捕获零个或多个字符。
  3. 首先使用/[转义,然后搜索右侧括号。
  4. 使用[^'"]来查找'"
  5. 使用[.+]来完成剩下的工作。
  6. 我真的不想再针对另一种情况再次提出这个问题,并希望得到一个解释,而不是一个可行的正则表达式。

    谢谢

3 个答案:

答案 0 :(得分:0)

我的意思是

\[[^'"]+

\[逃脱[ [^'"]+一次或多次

答案 1 :(得分:0)

你可以在正则表达式中使用负面预测

你可以使用正则表达式

^.*\[(?!['"])

在perl中测试

if($str=~/^.*\[(?!['"])/){

        print "match";

}

答案 2 :(得分:0)

编辑:之后,Alan的反馈意见是简化版。

^.*?\[(?!['"]).*

<强> ORIGINAL

这是一个经典的password-validation-style problem。首先,我会给你一个解决方案和演示,然后我会解释,然后我会给你一个更紧凑的解决方案,将两个条件合二为一。

此正则表达式将起作用(请参阅the demo,其中只匹配正确的行):

^(?=.*?\[)(?!.*?\[['"]).*$

它是如何运作的?

这类问题的处方是在一个环视中表达每个条件,然后,当我们满意时,匹配整个字符串(我们最后用.*

进行匹配

第一个条件:该行必须包含[

这由前瞻(?=.*?\[)表示,它在字符串的这一点断言(因为我们用^锚定,所以我们可以匹配任意数量的任何字符,然后是{ {1}}

第二个条件:该行不能包含[

这是由负向前瞻['"表示的,它在字符串中的这一点断言(因为我们用(?!.*?\[['"])锚定,因此我们无法匹配任何数量的任何字符后跟一个{ {1}}或^

将两个条件合二为一

此正则表达式将两个条件都转换为单个前瞻(see demo):

['

这一次,单一前瞻中存在负面的预测。主要的前瞻说:在字符串的这一点上(因为我们用["锚定,所以我们可以匹配任意数量的任何字符,后跟一个^(?=.*?\[(?!['"])).*$ ,后面没有{{1}或^