Я нахожусь на некотором синтаксическом анализе предложения SQL, и разработал рабочее регулярное выражение для поиска столбца вне строковых литералов с помощью «Rad Software Regular Expression Desginer», который использует .NET API. Чтобы убедиться, что разработанный RegEx также работает с Java, я протестировал его, конечно же, с помощью API (1.5 и 1.6). Но знаете что, это не сработает. Я получил сообщение
«У ретроспективной группы нет очевидной максимальной длины около индекса 28».
Строка, которую я пытаюсь проанализировать, это
Column_1='test''the''stuff''all''day''long' AND Column_2='000' AND TheVeryColumnIWantToFind = 'Column_1=''test''''the''''stuff''''all''''day''''long'' AND Column_2=''000'' AND TheVeryColumnIWantToFind = '' TheVeryColumnIWantToFind = '' AND (Column_3 is null or Column_3 = ''Not interesting'') AND ''1'' = ''1''' AND (Column_3 is null or Column_3 = 'Still not interesting') AND '1' = '1'
Как вы, возможно, догадались, я попытался создать какой-то наихудший случай, чтобы гарантировать, что RegEx не даст сбой в более сложных предложениях SQL where.
Сам RegEx выглядит так
(?i:(?<!=\s*'(?:[^']|(?:''))*)((?<=\s*)TheVeryColumnIWantToFind(?=(?:\s+|=))))
Я не уверен, есть ли более элегантный RegEx (скорее всего, он будет), но сейчас это не важно, поскольку он помогает.
Чтобы объяснить RegEx в нескольких словах: если он находит столбец, который я ищу, он выполняет отрицательный поиск, чтобы выяснить, используется ли имя столбца в строковом литерале. Если да, то не совпадет. Если нет, то подойдет.
Вернемся к вопросу. Как я уже говорил, с Java это не работает. Что сработает и приведет к тому, что я хочу?
Я узнал, что Java, похоже, не поддерживает неограниченное количество просмотров, но мне все равно не удалось заставить его работать.
Разве это не правильно, что взгляд -behind всегда ограничивает себя от смещения поиска до текущей позиции поиска? Значит, это приведет к чему-то вроде «позиция - смещение»?