Java RegEx не заменяет все ожидаемые шаблоны - PullRequest
2 голосов
/ 25 июня 2019

Все, чего я пытаюсь добиться, это заменить сравнительные равные на 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'

Фактический результат здесь не заменяет все необходимые равные (=).

1 Ответ

2 голосов
/ 25 июня 2019

Мы можем сделать это с помощью однострочного вызова String#replaceAll:

 String str = "SELECT * FROM db WHERE SUBJECT_TYPE = 'Person' AND PREDICATE = 'name' AND OBJECT_VALUE = 'John' AND VERSION = '0' ";
str = str.replaceAll("(WHERE|AND)\\s+(\\S+)\\s+=(?=\\s*'[^'+]+')", "$1 $2 ILIKE");
System.out.println(str);

. Эти выходные данные (отформатированные для удобства чтения):

SELECT *
FROM db
WHERE
    SUBJECT_TYPE ILIKE 'Person' AND
    PREDICATE ILIKE 'name' AND
    OBJECT_VALUE ILIKE 'John' AND
    VERSION ILIKE '0'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...