通过java regex验证简单的sql

时间:2015-11-13 17:56:12

标签: java regex

我正在尝试验证这两个简单的SQL查询

String sql1 = "select * from table".toLowerCase();
String sql2 = "select value from table".toLowerCase();

使用此模式

String pattern = "(select)(\\s)([\\*|\\w+])(\\s)(from)(\\s\\w+)";

然后我打印值

System.out.println(sql1.matches(pattern)); // true
System.out.println(sql2.matches(pattern)); // false

第一个是好的,但我在第二个声明中得到了错误。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

您在组中引入了方括号,如下所示:

String pattern = "(select)(\\s)([\\*|\\w+])(\\s)(from)(\\s\\w+)";

应该是:

String pattern = "(select)(\\s)(\\*|\\w+)(\\s)(from)(\\s\\w+)";

方括号内+|被视为文字字符:

[\\*|\\w+]表示*|+或字母的单个字符。

答案 1 :(得分:2)

因为你已经在角色类中放置了星形字符和单词字符修饰符。

如果你想在两个单独的单词之间进行选择,你不应该为两者使用字符类。相反,你可以使用逻辑OR(|)和捕获组,如下所示:

(\\*|\\w+)

另请注意,当您将|+放入角色类时,您的正则表达式引擎会将其转义。

此外,如果您想匹配整个句子,则不需要将所有单词放在捕获组中。您可以使用锚点^$来指定开始和结束字符串:

"^select\\s(?:\\*|\\w+)\\sfrom\\s\\w+$"

(?:)是一个无捕获组。

详细了解正则表达式http://www.regular-expressions.info/

答案 2 :(得分:0)

我认为问题是因为正则表达式中的+是贪婪的,所以\ w +正在消耗所有单词。所以它消耗“价值”“来自”和“表”。你可以在'+'之后加上问号,使其变得“懒惰”,如:

$('#tabs').tabs({disabled: disabledTabs});