我正在开发一个RegEx来检测一段代码中的SELECT语句。我开发了以下RegEx:
(?i:SELECT ([a-zA-Z0-9\s ,*~()=<>@#_&'\"-])*)\.
基本上捕获以SELECT
开头并以.
结尾的所有内容,这是行终止符(它们可以是多行的)。
但是,它还会捕获以*
开头的组,这是注释符号。如:
*SELECT * FROM TABLE.
我确实尝试使用负面预测(?!\*)
,但它仍然捕获SELECT语句。
我应该向RegEx添加什么,因为它不能捕获以*
开头的SELECT语句。
编辑:
Pattern p = Pattern.compile("^(\\s*)(?i:SELECT ([a-zA-Z0-9\\s ,*~()=<>@#_&'\"-])*)\\.");
Matcher m = p.matcher(code);
while(m.find())
{
//code
}
答案 0 :(得分:1)
您可以使用Negative LookBehind 代替否定预测
只需将(?<!\*)
放在单词SELECT
正则表达式
(?i:(?<!\*)SELECT ([a-zA-Z0-9\s ,*~()=<>@#_&'\"-])*)\.
答案 1 :(得分:0)
如果您只是在寻找以SELECT开头的内容,请将其锚定到开头,并使用^:
^SELECT[ ]{1,1}[a-zA-Z0-9*' ]
答案 2 :(得分:0)
^(?!\*)(?i:SELECT ([a-zA-Z0-9\s ,*~()=<>@#_&'\"-])*)\.
添加^
答案 3 :(得分:0)
如果您不习惯使用外观,则可以明确检查要捕获的每个SELECT
语句是字符串的开头,还是前面有一些非星号字符。请考虑以下模式:
(?:^|[^*])(SELECT (?:[a-zA-Z0-9\\s ,*~()=<>@#_&'\"-])*?)\\.
<强>代码:强>
String input = "SELECT * FROM table_one. hello world blah *SELECT * FROM table_two. blah ";
input += "SELECT * FROM table_three.";
Pattern p = Pattern.compile("(?:^|[^*])(SELECT (?:[a-zA-Z0-9\\s ,*~()=<>@#_&'\"-])*?)\\.");
Matcher m = p.matcher(input);
while (m.find()) {
System.out.println(mix.group(1));
}
<强>输出:强>
SELECT * FROM table_one
SELECT * FROM table_three