java正則表達(dá)式精確查找和替換指定字符代碼示例
情形:
在復(fù)制模型的時(shí)候,要給名稱加上“-復(fù)制”。一開始用的是 replace進(jìn)行全部替換。在測(cè)試的時(shí)候,出現(xiàn)有元素名稱跟模型名稱是一樣的,這樣替換就有問題。這時(shí)候要改成正則去匹配和替換對(duì)應(yīng)內(nèi)容。
{ "flowModel": { "flowMod": 502, "flowType": 2, "flowTypeName": "普通流程", "flowTypeNameUs": "common", "flowName": "流程表單模型A", "flowNameUs": "流程表單模型A", "fieldName": "流程表單模型A", "state": "A" }, "formModel": { "formId": 108, "flowMod": 502, "flowName": "流程表單模型A", "flowNameUs": "流程表單模型A", "formName": "流程表單模型A", "formNameUs": "流程表單模型A", "fieldName": "流程表單模型A" } }
目標(biāo): 替換里面 flowName, flowNameUs,formName和formNameUs的名稱
先處理一個(gè)
先寫正則表單式:
String pattern ="\"flowName\""+ ":"+"\\s*\"" + modelName + "\"";
\\s*可以匹配0到多個(gè)空格
匹配到對(duì)應(yīng)值后,用整個(gè)值進(jìn)行替換
public static String matchReplaceName(String content, String modelName, String newModelName) { String pattern ="\"flowName\""+ ":"+"\\s*\"" + modelName + "\""; System.out.println("pattern "+pattern); Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(content); StringBuffer sb = new StringBuffer(); while (m.find()) { String group = m.group(); m.appendReplacement(sb, group.replace(modelName, newModelName)); } m.appendTail(sb); return sb.toString(); }
測(cè)試:
public static void main(String[] args) { String content = initData(); String modelName = "流程表單模型A"; String newModelName = "流程表單模型A-復(fù)制"; content = matchReplaceName(content, modelName, newModelName); System.out.println(content); } private static String initData(){ String data = "{\n" + "\t\"flowModel\": {\n" + "\t\t\"flowMod\": 502,\n" + "\t\t\"flowType\": 2,\n" + "\t\t\"flowTypeName\": \"普通流程\",\n" + "\t\t\"flowTypeNameUs\": \"common\",\n" + "\t\t\"flowName\": \"流程表單模型A\",\n" + "\t\t\"flowNameUs\": \"流程表單模型A\",\n" + "\t\t\"fieldName\": \"流程表單模型A\",\n" + "\t\t\"state\": \"A\"\n" + "\t},\n" + "\t\"formModel\": {\n" + "\t\t\"formId\": 108,\n" + "\t\t\"flowMod\": 502,\n" + "\t\t\"flowName\": \"流程表單模型A\",\n" + "\t\t\"flowNameUs\": \"流程表單模型A\",\n" + "\t\t\"formName\": \"流程表單模型A\",\n" + "\t\t\"formNameUs\": \"流程表單模型A\",\n" + "\t\t\"fieldName\": \"流程表單模型A\"\n" + "\t}\n" + "}"; return data; }
結(jié)果:
pattern "flowName":\s*"流程表單模型A" { "flowModel": { "flowMod": 502, "flowType": 2, "flowTypeName": "普通流程", "flowTypeNameUs": "common", "flowName": "流程表單模型A-復(fù)制", "flowNameUs": "流程表單模型A", "fieldName": "流程表單模型A", "state": "A" }, "formModel": { "formId": 108, "flowMod": 502, "flowName": "流程表單模型A-復(fù)制", "flowNameUs": "流程表單模型A", "formName": "流程表單模型A", "formNameUs": "流程表單模型A", "fieldName": "流程表單模型A" } }
多個(gè)的:
表達(dá)式:
完成了單個(gè),多個(gè)的用"|"進(jìn)行分隔,先繼續(xù)寫單個(gè)的,然后拼接多一起
public static String matchReplaceName(String content, String modelName, String newModelName) { String condition = ":"+"\\s*\"" + modelName + "\""; String pattern1 = "\"flowName\""+condition; String pattern2 = "\"flowNameUs\""+condition; String pattern3 = "\"formName\""+condition; String pattern4 = "\"formNameUs\""+condition; String pattern = pattern1 +"|"+pattern2+"|"+ pattern3 +"|"+pattern4; System.out.println("pattern "+pattern); Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(content); StringBuffer sb = new StringBuffer(); while (m.find()) { String group = m.group(); group = group.replace(modelName, newModelName); m.appendReplacement(sb, group); } m.appendTail(sb); return sb.toString(); }
最后可以把pattern的輸出弄成一整行
測(cè)試結(jié)果:
pattern "flowName":\s*"流程表單模型A"|"flowNameUs":\s*"流程表單模型A"|"formName":\s*"流程表單模型A"|"formNameUs":\s*"流程表單模型A" { "flowModel": { "flowMod": 502, "flowType": 2, "flowTypeName": "普通流程", "flowTypeNameUs": "common", "flowName": "流程表單模型A-復(fù)制", "flowNameUs": "流程表單模型A-復(fù)制", "fieldName": "流程表單模型A", "state": "A" }, "formModel": { "formId": 108, "flowMod": 502, "flowName": "流程表單模型A-復(fù)制", "flowNameUs": "流程表單模型A-復(fù)制", "formName": "流程表單模型A-復(fù)制", "formNameUs": "流程表單模型A-復(fù)制", "fieldName": "流程表單模型A" } }
附:如何在java中獲取兩個(gè)字符之間的精確字符串
在Java中,可以使用String類的substring()方法來獲取兩個(gè)字符之間的精確字符串。該方法接受兩個(gè)參數(shù),分別是起始索引和結(jié)束索引(不包括結(jié)束索引)。下面是一個(gè)示例代碼:
String str = "Hello, World!"; int startIndex = 7; // 起始索引 int endIndex = 13; // 結(jié)束索引(不包括) String result = str.substring(startIndex, endIndex); System.out.println(result); // 輸出 "World"
在上述示例中,我們定義了一個(gè)字符串"Hello, World!",然后使用substring()方法獲取了索引為7到12的子字符串,即"World"。
需要注意的是,索引是從0開始的,所以起始索引為7表示從第8個(gè)字符開始,結(jié)束索引為13表示到第14個(gè)字符之前結(jié)束。
這種方法適用于獲取兩個(gè)字符之間的精確字符串,可以用于各種字符串處理場(chǎng)景,例如提取關(guān)鍵信息、截取特定部分等。
總結(jié):
如果要精確替換指定字符,可以考慮正則,\\s*可以匹配0到多個(gè)空格 適用性會(huì)replace更好。先從單個(gè)開始入手,再逐個(gè)增加,驗(yàn)證,這樣更能發(fā)現(xiàn)問題和調(diào)試。
到此這篇關(guān)于java正則表達(dá)式精確查找和替換指定字符的文章就介紹到這了,更多相關(guān)java正則精確查找替換字符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot靜態(tài)資源css,js,img配置方案
這篇文章主要介紹了SpringBoot靜態(tài)資源css,js,img配置方案,下文給大家分享了三種解決方案,需要的朋友可以參考下2017-07-07解決IDEA上循環(huán)依賴報(bào)錯(cuò)問題Error:java: Annotation processing&n
這篇文章主要介紹了解決IDEA上循環(huán)依賴報(bào)錯(cuò)問題Error:java: Annotation processing is not supported for module cycles,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2023-10-10IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能一覽
這篇文章主要介紹了IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04java實(shí)現(xiàn)分布式項(xiàng)目搭建的方法
這篇文章主要介紹了java實(shí)現(xiàn)分布式項(xiàng)目搭建的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法
這篇文章主要介紹了SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07我總結(jié)的幾種@Transactional失效原因說明
這篇文章主要是我總結(jié)的幾種@Transactional失效原因說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11使用maven創(chuàng)建普通項(xiàng)目命令行程序詳解
大部分使用maven創(chuàng)建的是web項(xiàng)目,這里使用maven創(chuàng)建一個(gè)命令行程序,目的是讓大家了解maven特點(diǎn)和使用方式,有需要的朋友可以借鑒參考下2021-10-10Jmeter結(jié)構(gòu)體系及運(yùn)行原理順序解析
這篇文章主要介紹了Jmeter結(jié)構(gòu)體系及運(yùn)行原理順序解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09