我的Java正则表达式找不到简单的字符串文字但String.indexOf表示它存在

时间:2018-05-17 21:45:26

标签: java regex

我有一些SQL开头如下:

String sql = "SELECT "+
        "    SI.SITE_ID "; ....

最终我想编写一个正则表达式,根据文字字符串(列名)“SITE_ID”,它将找到完全限定的列名称(使用前面的“SI。”。在写完我认为可以用于此目的的工作之后(Pattern.compile("\\s+\\w+\\." + "SITE_ID" + "\\s+")然后,最终提取一个捕获)但是它没有返回我预期的结果,我决定简化。

现在虽然尽管我已经尽可能简化了想法,但只是在sql变量中搜索字符串文字“SITE_ID”,它仍然返回false,但是sql.indexOf()返回大于-1的值,因此sql 包含字符串:

boolean foundSiteId = Pattern.compile("SITE_ID").matcher(sql).matches(); // false
int siteIdPos = sql.indexOf("SITE_ID"); // 12

我发现这令人惊讶;这并不是说我试图通过^将“SITE_ID”锚定到前面或使用$结束。另外,我已经出去https://www.freeformatter.com/java-regex-tester.html(因为反复编译代码很费时)尝试,如果我同时输入“SITE_ID”(不带引号)作为“Java正则表达式”和“条目”测试“它确实返回真实。但是,如果我提供带有前导和尾随空格的“SITE_ID”以进行测试,则返回true。

我想我必须对Java正则表达式有一些基本的误解,尽管我从其他语言中对它们有相当的了解。我做错了什么,谢谢。

1 个答案:

答案 0 :(得分:2)

致电find(),您将获得true,例如

boolean foundSiteId = Pattern.compile("SITE_ID").matcher(sql).find();

至于你原来的目标,你可以做点什么

String sql = "SELECT " 
        + "    SI.SITE_ID ";
Pattern p = Pattern.compile("\\b(\\w+\\.SITE_ID)");
Matcher m = p.matcher(sql);
if (m.find()) {
    System.out.println(m.group(1));
}

我得到(我认为你想要的)

SI.SITE_ID