Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java正则表达式验证简单sql_Java_Regex - Fatal编程技术网

用java正则表达式验证简单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));

我试图验证这两个简单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

第一个是可以的,但是我在第二个陈述中弄错了。有人能帮忙吗?

我想问题是因为正则表达式中的+是贪婪的,所以\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+$"
(?:)
是一个无捕获组


阅读有关正则表达式的更多信息

非常感谢,问题解决也感谢教程:)非常感谢,问题解决也感谢教程:)