java正則表達(dá)式精確查找和替換指定字符代碼示例
情形:
在復(fù)制模型的時(shí)候,要給名稱加上“-復(fù)制”。一開始用的是 replace進(jìn)行全部替換。在測(cè)試的時(shí)候,出現(xiàn)有元素名稱跟模型名稱是一樣的,這樣替換就有問(wè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()方法來(lái)獲取兩個(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)問(wè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ò)問(wèn)題Error:java: Annotation processing&n
這篇文章主要介紹了解決IDEA上循環(huán)依賴報(bào)錯(cuò)問(wèn)題Error:java: Annotation processing is not supported for module cycles,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2023-10-10
IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能一覽
這篇文章主要介紹了IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
java實(shí)現(xiàn)分布式項(xiàng)目搭建的方法
這篇文章主要介紹了java實(shí)現(xiàn)分布式項(xiàng)目搭建的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法
這篇文章主要介紹了SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
我總結(jié)的幾種@Transactional失效原因說(shuō)明
這篇文章主要是我總結(jié)的幾種@Transactional失效原因說(shuō)明,具有很好的參考價(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-10
Jmeter結(jié)構(gòu)體系及運(yùn)行原理順序解析
這篇文章主要介紹了Jmeter結(jié)構(gòu)體系及運(yùn)行原理順序解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

