Pratik
Pratik

Reputation: 988

Java RegEx not replacing all expected patterns

All I am trying to achieve is to replace comparative equals with ILIKE, but not assignment statements.

i.e.

SELECT * FROM db WHERE SUBJECT_TYPE = 'Person';

should be replaced as

SELECT * FROM db WHERE SUBJECT_TYPE ILIKE 'Person';

However

SET session ABC.VAR = 5;

should remain untouched.

For this I am trying to use lookahead such that there is no SET before equals (=).

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);

Actual outcome:

SELECT * FROM db WHERE SUBJECT_TYPE ILIKE 'Person' AND PREDICATE = 'name' AND OBJECT_VALUE = 'John' AND VERSION = '0'

Expected outcome:

SELECT * FROM db WHERE SUBJECT_TYPE ILIKE 'Person' AND PREDICATE ILIKE 'name' AND OBJECT_VALUE ILIKE 'John' AND VERSION ILIKE '0'

The actual outcome here doesn't replace all necessary equals (=).

Upvotes: 1

Views: 79

Answers (1)

Tim Biegeleisen
Tim Biegeleisen

Reputation: 521457

We can do this with a one-liner call to 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);

This outputs (formatted for readability):

SELECT *
FROM db
WHERE
    SUBJECT_TYPE ILIKE 'Person' AND
    PREDICATE ILIKE 'name' AND
    OBJECT_VALUE ILIKE 'John' AND
    VERSION ILIKE '0'

Upvotes: 1

Related Questions