我有一些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正则表达式有一些基本的误解,尽管我从其他语言中对它们有相当的了解。我做错了什么,谢谢。
答案 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