我的声明如下
#sv_q = " INSERT INTO alertuser.REALTIME
每当使用 insert 关键字时,我都会尝试创建一个正则表达式来匹配文件中一组行中的这一行。但由于开头使用了“#”,我不想考虑这一行。如何实现这一目标。我尝试了下面的正则表达式,但仍然正在考虑这一行,有人可以建议如何实现这一点吗?
static Pattern tracePattern = Pattern.compile("(?!\\#).*insert\\s*into",Pattern.CASE_INSENSITIVE);
Matcher localMatcher = tracePattern.matcher(line);
if (localMatcher.find()) {
// doing some checks
}
最佳答案
如果您想使用.find()
,您需要在开头锚定模式 ^
或\A
。此外,您最好使用单词边界来仅匹配整个单词 insert
和into
,并使用\s+
而不是\s*
强制 insert
之间至少出现 1 次空格和into
:
"^(?!#).*\\binsert\\s+into\\b"
您可以将解决方案缩短为
if (s.matches("(?i)(?!#).*\\binsert\\s+into\\b.*")) { doing some checks}
matches()
方法需要完整的字符串匹配,因此,您需要添加 .*
在最后。另外,Pattern.CASE_INSENSITIVE
选项可以在嵌入标志选项的帮助下内联使用 (?i)
。如果您的输入可以包含换行符,请使用 (?si)
而不是(?i)
.
关于java - 正则表达式模式来否定一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40882115/