Java正则表达式-双负前行-忽略括号-忽略以'-'开头的行

时间:2019-05-17 12:31:13

标签: java regex negative-lookahead

我需要在字符串函数中介绍两种情况。

  1. 忽略';'如果放在括号中
  2. 忽略';'如果行以“-”开头

我有一个包含多个SQL语句的大字符串,需要在';'上进行拆分除非在上述情况下有注释块,或者函数中存在分号-具有讽刺意味的是,例如REGEXP()

我尝试在现有内容之前或之后放置第二个否定的超前代码块,但这似乎行不通。

String[] queries = queryParam.trim().split(";(?![^()]*\\))");-适用于括号

String[] queries = queryParam.trim().split(";(?![^()]*\\))(?!-*\-)");-不起作用

String[] queries = queryParam.trim().split(";(?!-*\-)(?![^()]*\\))");-不起作用

https://regex101.com/r/Sdx8TC/1

2 个答案:

答案 0 :(得分:1)

我想出了这个正则表达式:

((?:(?:\-\-[^*]*+(?:[^\-\-][^*]*\-\-)*|(?:[^\-\-]|\-\-\n?)*?\n)|(?:\((?:\(.|[^\(])*\(|\((?:\).|[^\)])*\)|.[^\)\;]*))*?)(;)

正则表达式确保:

  1. 忽略';'如果放在括号中
  2. 忽略';'如果行以“-”开头

链接以查看正则表达式的实际作用:https://regex101.com/r/AFnWqD/1/

答案 1 :(得分:0)

您的第二个要求是if line starts with '--'。在这种情况下,负向搜索(?!-*\-)将不起作用,因为您的匹配以;开头,所以该行不再以--开头。

使用模式可能要做的是首先检查字符串是否以-开头,例如将匹配项与此模式结合使用:

^[ \\t]*--.*$

Regex demo

如果匹配,则将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]

Java demo