Java regexp - двойной отрицательный взгляд - игнорировать круглые скобки - игнорировать строки, начинающиеся с '-' - PullRequest
1 голос
/ 17 мая 2019

Мне нужно покрыть два сценария в строковой функции.

  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 ]

1 голос
/ 18 мая 2019

Я придумал это регулярное выражение:

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

Регулярное выражение обеспечивает следующее:

  1. Игнорировать ';'если в скобках
  2. Игнорировать ';'если строка начинается с '-'

Ссылка для просмотра регулярного выражения в действии: https://regex101.com/r/AFnWqD/1/

0 голосов
/ 18 мая 2019

Ваше второе требование 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-демонстрация

...