用java正则表达式验证简单sql
我试图验证这两个简单sql查询的有效性用java正则表达式验证简单sql,java,regex,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));
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
第一个是可以的,但是我在第二个陈述中弄错了。有人能帮忙吗?我想问题是因为正则表达式中的+是贪婪的,所以\w+消耗了所有的单词。因此,它正在消耗“值”、“来自”和“表”。您可以通过在“+”后面加问号使其“懒惰”,如:
([\\*|\\w+?])
我认为问题是因为正则表达式中的+是贪婪的,所以\w+消耗了所有的单词。因此,它正在消耗“值”、“来自”和“表”。您可以通过在“+”后面加问号使其“懒惰”,如:
([\\*|\\w+?])
您在组中引入了方括号,如下所示:
String pattern = "(select)(\\s)([\\*|\\w+])(\\s)(from)(\\s\\w+)";
应该是:
String pattern = "(select)(\\s)(\\*|\\w+)(\\s)(from)(\\s\\w+)";
方括号内的+
和|
被视为文字字符:
[\*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
String pattern = "(select)(\\s)([\\*|\\w+])(\\s)(from)(\\s\\w+)";
应该是:
String pattern = "(select)(\\s)(\\*|\\w+)(\\s)(from)(\\s\\w+)";
方括号内的+
和|
被视为文字字符:
[\*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
当您想在两个单独的单词之间进行选择时,不应同时使用字符类。相反,您可以使用逻辑OR(
)和捕获组,如下所示:
(\\*|\\w+)
还请注意,当您将|
或+
放在字符类中时,正则表达式引擎将转义它们
此外,如果要匹配整个句子,不需要将所有单词放在捕获组中。可以使用锚定^
和$
指定字符串的开头和结尾:
"^select\\s(?:\\*|\\w+)\\sfrom\\s\\w+$"
(?:)
是一个无捕获组
阅读有关正则表达式的更多信息这是因为您将星号字符和单词字符修饰符放在了字符类中
当您想在两个单独的单词之间进行选择时,不应同时使用字符类。相反,您可以使用逻辑OR(
)和捕获组,如下所示:
(\\*|\\w+)
还请注意,当您将|
或+
放在字符类中时,正则表达式引擎将转义它们
此外,如果要匹配整个句子,不需要将所有单词放在捕获组中。可以使用锚定^
和$
指定字符串的开头和结尾:
"^select\\s(?:\\*|\\w+)\\sfrom\\s\\w+$"
(?:)
是一个无捕获组
阅读有关正则表达式的更多信息非常感谢,问题解决也感谢教程:)非常感谢,问题解决也感谢教程:)