我正在尝试验证这两个简单的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
第一个是好的,但我在第二个声明中得到了错误。有人可以帮忙吗?
答案 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});