如果以字符开头,则正则表达式不匹配

时间:2017-04-17 06:07:29

标签: java regex

我正在开发一个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
}

4 个答案:

答案 0 :(得分:1)

您可以使用Negative LookBehind 代替否定预测

只需将(?<!\*)放在单词SELECT

之前

正则表达式

(?i:(?<!\*)SELECT ([a-zA-Z0-9\s ,*~()=<>@#_&'\"-])*)\.

DEMO

答案 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
相关问题