正則表達式去除括號的問題
某字符串 aaa(bbb)cccddd
需求是要判斷是否包含 aaa(bbb),如果包含,那就去掉(bbb),輸出aaacccddd
我們先使用正則表達式:
String content = "aaa(bbb)cccddd";
String reg= "aaa(\\(bbb\\))";
Matcher mac = Pattern.compile(reg).matcher(content);
if(mac.find()){
content = content.replaceAll(mac.group(1), "");
}
這段代碼卻輸出了 aaa()cccddd這樣的結果
為什么沒有去掉括號呢?
mac.group(1)輸出了 (bbb) 的結果,卻沒有被replaceAll替換掉括號。原因是這里括號又沒有正則轉譯,系統沒有識別。
(注:reg里的括號,沒有轉譯的部分會被正則表達式識別為分組)
所以這里只能用如下方法:
String content = "aaa(bbb)cccddd";
String reg= "aaa\\(bbb\\)";
Matcher mac = Pattern.compile(reg).matcher(content);
if(mac.find()){
//因為正則里不識別括號,只能把括號里內容提取出來,然后前后拼接括號
//取出括號里的內容
String brace = getBrace(mac.group(1));
//拼接括號
brace = "\\("+ brace + "\\)";
content = content.replaceAll(brace, "");
}
//提取括號里的內容
public static String getBrace(String str){
Pattern p = Pattern.compile("(\\[[^\\]]*\\])");
Matcher m = p.matcher(str);
while(m.find()){
str = m.group().substring(1, m.group().length()-1);
}
return str;
}
把去除括號的方法修改一下,拿出括號里的內容,前后拼接括號,再去除。
這樣就可以了。輸出結果aaacccddd