亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java RegEx 沒有替換所有預期的模式

Java RegEx 沒有替換所有預期的模式

MM們 2023-02-16 15:36:34
我想要實現的只是用 ILIKE 代替比較等于,而不是賦值語句。IESELECT * FROM db WHERE SUBJECT_TYPE = 'Person';應該替換為SELECT * FROM db WHERE SUBJECT_TYPE ILIKE 'Person';然而SET session ABC.VAR = 5;應該保持不變。為此,我正在嘗試使用前瞻性,以便在等于 (=)之前沒有SET。爪哇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'這里的實際結果不會替換所有必要的等號 (=)。
查看完整描述

1 回答

?
DIEA

TA貢獻1820條經驗 獲得超2個贊

我們可以通過單行調用來做到這一點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'


查看完整回答
反對 回復 2023-02-16
  • 1 回答
  • 0 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號