Я перешел к некоторому SQL-запросу, где разбирал предложение и разработал работающий RegEx для поиска столбца вне строковых литералов, используя "Rad Software 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, похоже, не поддерживает неограниченное количество просмотров, но все же не смог заставить его работать.
Разве не правильно, что предыстория всегда накладывает ограничение на себя от поискового смещения до текущей поисковой позиции? Таким образом, это приведет к чему-то вроде «смещение позиции»?