假设在Eclipse中打开的文件具有以下字符串
$stmt = "select addr from
student
where id=123";
$stmtA = "alter table tablename";
$stmtB = " delete from student
where school=ABC";
$var1 = "This is not a query.
Just a string";
我需要找到影响学生表和学校专栏的所有查询语句。搜索:
(?s)"(.*?)"
给了我所有引用并分布在多行上的字符串。现在,我如何增强上述正则表达式来过滤结果,以确保结果具有
1)选择或更改或插入或删除MySQL的关键字, 和 2)学生和学校的关键词。
我认为满足以上两个条件我将能够提取击中学生表和学校专栏的字符串。有帮助吗?
答案 0 :(得分:2)
(?s)".*?(?:select|alter|insert|delete).*?(?:student|school).*?"
虽然使用[^"]*?
代替.*?
可能会更好。
修改强>
让我们切换到lookaheads,因为在确保某些条件时(如字符串长度,有特殊字符或smthg),它们是非常酷的工具:
(?s)".*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?"
好的,如果你对正则表达式不感兴趣,你可以在此停止,否则,作为前瞻的一个例子(注意:这个比较慢):
(?s)"(?=[^"]*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?"
如果您有权访问原子组,最好这样做(atomic grouping):
(?>select|alter|insert|delete)
好像一个单词在第一个字母后无法匹配,它会跳过其余的单词(它们都有不同的第一个字母)。
最后,我想你可以使用if/then/else:
(?s)".*?(?:select|alter|insert|delete).*?(?:(student)|school)(?(1).*?school|.*?student).*?"
或类似的东西。