gpt4 book ai didi

Java RegEx 未替换所有预期模式

转载 作者:行者123 更新时间:2023-11-30 01:49:09 25 4
gpt4 key购买 nike

我想要实现的目标是将比较等于替换为 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 'Person' AND PREDICATE = 'name' AND OBJECT_VALUE = 'John' AND VERSION = '0'

预期结果:

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

此处的实际结果不会取代所有必要的等号 (=)。

最佳答案

我们可以通过对 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'

关于Java RegEx 未替换所有预期模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56746878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com