如何用String类replaceAll方法替换正则不匹配的所有内容?
如何用replaceAll替换所有不匹配目标正则的内容
嘿,这个问题我太熟了!咱们先聊聊你之前尝试的问题出在哪,再给你靠谱的解决方案~
为什么你的尝试没成功?
你用的(?!" + regex + "$).*这个正则,逻辑是匹配“整个字符串不是以[xxx]结尾”的情况,但它是从整个字符串的全局视角来判断的,而不是逐个匹配局部的非目标子串。所以只要你的字符串不是完全由[xxx]组成,这个正则就会匹配整个字符串,替换成空后自然得不到想要的结果。
两种可行的解决方案
方案一:直接捕获目标内容(最简洁)
既然你最终想要的是方括号里的内容,完全可以直接用正则匹配整个字符串,捕获括号内的部分,然后替换成捕获的内容。这种方法比取反正则更直观高效:
String test = "some text [keep this] may be some more .."; String result = test.replaceAll("^.*?\\[(.*?)\\].*$", "$1"); // result就是"keep this"
这个正则的拆解:
^.*?:匹配字符串开头的任意内容,非贪婪模式(避免把方括号里的内容也吃掉)\\[(.*?)\\]:匹配方括号,并把括号内的内容捕获到分组1.*$:匹配方括号后的所有内容- 替换成
$1就只保留了分组1里的内容,完美得到你要的结果!
方案二:取反正则替换非目标内容
如果你一定要用“取反正则”的思路,也就是替换所有不匹配\\[(.*?)\\]的内容,可以这样做:
首先,我们需要匹配所有不是完整方括号子串的部分,然后替换为空,最后再去掉剩下的方括号:
String test = "some text [keep this] may be some more .."; // 第一步:替换所有不匹配方括号子串的内容为空 String temp = test.replaceAll("(?:(?!\\[(.*?)\\]).)+", ""); // 第二步:去掉方括号得到最终结果 String result = temp.replaceAll("[\\[\\]]", "");
这里的(?:(?!\\[(.*?)\\]).)+是一个负向环视的正则,意思是:匹配一串字符,其中每一个字符的后面都不跟着完整的[xxx]子串,这样就精准匹配了所有方括号外的内容,替换为空后就只剩下[keep this],再去掉方括号就得到目标结果。
多组方括号的情况(扩展)
如果你的字符串里有多组方括号(比如text [a] more [b] end),想要把所有括号内的内容都保留(比如得到ab),可以稍微修改正则:
String test = "text [a] more [b] end"; // 替换所有非括号内的内容为空,再去掉方括号 String result = test.replaceAll("[^\\[]*\\[|\\][^\\]]*", "").replaceAll("[\\[\\]]", ""); // result是"ab",如果想要空格分隔可以调整正则
内容的提问来源于stack exchange,提问作者Trillian
相关产品推荐
相关产品推荐

