Все, чего я пытаюсь добиться, это заменить сравнительные равные на ILIKE, но не на операторы присваивания.
т.е.
SELECT * FROM db WHERE SUBJECT_TYPE = 'Person';
следует заменить на
SELECT * FROM db WHERE SUBJECT_TYPE ILIKE 'Person';
Однако
SET session ABC.VAR = 5;
должен остаться нетронутым.
Для этого я пытаюсь использовать прогноз так, чтобы не было SET до того, как равно (=) .
Java
String str = "SELECT * FROM db WHERE SUBJECT_TYPE = 'Person' AND PREDICATE = 'name' AND OBJECT_VALUE = 'John' AND VERSION = '0' "
final Pattern EQUALS_ILIKE_PATTERN = Pattern.compile("(?i)((^((?!SET)[^=])+?)\\s*)=");
final Matcher matcher = EQUALS_ILIKE_PATTERN .matcher(str);
while (matcher.find())
{
final String fromString = matcher.group(0);
str = matcher.replaceAll("$1 ILIKE");
}
System.out.println(str);
Фактический результат:
SELECT * FROM db WHERE SUBJECT_TYPE ILIKE «Персона» И ПРЕДИКАТ =
'name' AND OBJECT_VALUE = 'John' AND VERSION = '0'
Ожидаемый результат:
SELECT * FROM db WHERE SUBJECT_TYPE ILIKE «Персона» и предикат
ILIKE 'имя' И OBJECT_VALUE ILIKE 'Джон' И ВЕРСИЯ ILIKE '0'
Фактический результат здесь не заменяет все необходимые равные (=).