我偶尔遇到这个问题,我终于想要一劳永逸地解决这个问题。
最好提出一个可以实际使用的例子。想象一下,你有一个使用mysql和php的很多INSERT-INTO语句的应用程序,你想找到没有mysql_real_escape_string()的语句,因为它们容易被sql注入。为了简单起见,我们假设每个查询都以分号结尾。
那么如何匹配以“INSERT INTO”开头并以“;”结尾的字符串并且不包含“mysql_real_escape_string”?
我的假设是,你必须使用的量词(+和*)以及正则表达式总是试图匹配的事实将导致正则表达式执行的行为与前瞻或后瞻的字符一样多。包含的字符串找不到它,即使它在那里。我认为那是核心问题。
答案 0 :(得分:4)
使用否定前瞻:
^INSERT INTO(?!mysql_real_escape_string)(.(?!mysql_real_escape_string))*;$