正则表达式只选择查询?

时间:2014-05-30 00:41:15

标签: regex regex-negation regex-lookarounds

我正在寻找一个只允许严格选择查询的正则表达式, 不允许插入,删除,更改或任何类型的查询,并且查询可以有多行..

我试过

var pattern="(^select)^((?!insert|delete|alter).)*$";

var pattern=^(?!insert|delete|alter|modify|add|create|drop|truncate|rename|update|rollback|commit|grant|revoke|savepoint)(.(?!insert|delete|alter|modify|add|create|drop|truncate|rename|update|rollback|commit|grant|revoke|savepoint))*$";  

如何使其与多行上的插入或任何关键字不匹配(在javascript中)。

失败
Eg: select *
insert 
into

这意味着它应该以"选择"并且不能在查询中的任何位置插入,但这不起作用。

2 个答案:

答案 0 :(得分:0)

正如评论中所提到的,这个想法存在很多问题。但就如何实现这一目标而言:

/^select(?:(?!insert|delete|alter)[\s\S])*$/i

这将确保select(不区分大小写)是第一个单词。然后我几乎完全使用了你表达的其余部分。我将*重复投放到非捕获组中,并将.更新为[\s\S](因为.匹配任何字符 ,除了 换行符。

答案 1 :(得分:0)

这不容易(如果有的话)。

用户可能想要运行的无数无害查询,任何理智的正则表达式都会被提取。例如,如果StackOverflow用户想要查找包含文本“delete”的所有问题,则查询可能最终成为:

SELECT * FROM Questions WHERE Body LIKE "%delete%"

正则表达式单词边界(\b)不起作用,因为%delete之间存在单词边界。添加空格可能有效,即。 /^ *delete/但是,如果用户想要只找到删除这个词,那该怎么办:

SELECT * FROM Questions WHERE Body LIKE "% delete %"

仍然是有效的查询。因此,除非你强迫用户永远不能查询数据库中也是SQL命令的任何单词,否则你就不走运了。