2

假设在 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)学生和学校的关键字。

我认为满足以上两个条件,我将能够提取命中学生表和学校列的字符串。有什么帮助吗?

4

1 回答 1

2
(?s)".*?(?:select|alter|insert|delete).*?(?:student|school).*?"

虽然使用[^"]*?而不是.*?可能会更好。

编辑:
让我们切换到前瞻,因为它们在确保某些条件(如字符串长度,具有特殊字符或 smthg)时是非常酷的工具:

(?s)".*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?"

好的,如果您对正则表达式不感兴趣,您可以在这里停下来,否则,作为前瞻的示例(注意:这比较慢):

(?s)"(?=[^"]*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?"

如果您可以访问原子组,最好这样做(原子分组):

(?>select|alter|insert|delete)

好像一个单词在第一个字母之后无法匹配,它会跳过其余的单词(它们都有不同的第一个字母)。

最后,我想你可以使用if/then/else

(?s)".*?(?:select|alter|insert|delete).*?(?:(student)|school)(?(1).*?school|.*?student).*?"

或类似的东西。

于 2013-04-02T11:41:40.603 回答