正则表达式如何在特定单词后面阻止匹配。像第一个字符包含lookahead?
问题描述:
我正在使用正则表达式来匹配SQL查询中的条件。我想要WHERE <ANY CONDITION>
,但WHERE ROWNUM <WHATEVER>
除外。
所以我不想在WHERE
关键字后面出现ROWNUM
。正则表达式如何在特定单词后面阻止匹配。像第一个字符包含lookahead?
我确实使用Lookaheads来实现这一点。我的正则表达式是WHERE (.*(?! ROWNUM)+)
。问题是,它仍然匹配WHERE ROWNUM < 1000
。如果我在正则表达式中删除ROWNUM
之前的空格,则名称以ROWNUM
结尾的任何列都不会匹配。如果我删除WHERE
后的空间,那么即使WHERE
关键字后没有空格,它也会匹配。但是,如果ROWNUM
和WHERE
关键字(可能是条件)之间有两个空格或任何其他字符,则表示没有问题。所以如果ROWNUM
是第一个在我的正则表达式不起作用。
我该如何解决这个问题?
答
这听起来像你想
WHERE(?!.*\bROWNUM\b).*
将匹配WHERE .*
,除非的.*
包含ROWNUM
由单词边界包围。 (\b
“词边界”,是一种零宽度断言表示由一个字母或数字之前或下划线或后跟一个字母或数字或下划线,但不能同时的位置。)
难道不这个原因不匹配WHERE ABROWNUM?我想要匹配。 – Bren 2012-03-06 17:03:54
@brhneser:不要害怕:'WHERE ABROWNUM'仍然会匹配,因为'。*'会以'AB'开始,而负向预测不会计算该值。 – ruakh 2012-03-06 17:55:23
噢,好吧,我刚刚明白你的意思。但这不是我想要的。例如,这仍然会匹配“WHERE a = 5和rownum Bren 2012-03-06 19:54:20