我需要在字符串函数中介绍两种情况。
我有一个包含多个SQL语句的大字符串,需要在';'上进行拆分除非在上述情况下有注释块,或者函数中存在分号-具有讽刺意味的是,例如REGEXP()
我尝试在现有内容之前或之后放置第二个否定的超前代码块,但这似乎行不通。
String[] queries = queryParam.trim().split(";(?![^()]*\\))");
-适用于括号
String[] queries = queryParam.trim().split(";(?![^()]*\\))(?!-*\-)");
-不起作用
String[] queries = queryParam.trim().split(";(?!-*\-)(?![^()]*\\))");
-不起作用
答案 0 :(得分:1)
我想出了这个正则表达式:
((?:(?:\-\-[^*]*+(?:[^\-\-][^*]*\-\-)*|(?:[^\-\-]|\-\-\n?)*?\n)|(?:\((?:\(.|[^\(])*\(|\((?:\).|[^\)])*\)|.[^\)\;]*))*?)(;)
正则表达式确保:
链接以查看正则表达式的实际作用:https://regex101.com/r/AFnWqD/1/
答案 1 :(得分:0)
您的第二个要求是if line starts with '--'
。在这种情况下,负向搜索(?!-*\-)
将不起作用,因为您的匹配以;
开头,所以该行不再以--
开头。
使用模式可能要做的是首先检查字符串是否以-开头,例如将匹配项与此模式结合使用:
^[ \\t]*--.*$
如果匹配,则将split与您的模式一起使用:
;(?![^()]*\\))
例如:
String[] strings = {
" --hello;(hello;hello)hello;",
"hello;(hello;hello)hello;"
};
for (String s : strings) {
if (!s.matches("^[ \\t]*--.*$")) {
System.out.println(Arrays.toString(s.split(";(?![^()]*\\))")));
}
}
结果:
[hello, (hello;hello)hello]