如何替换所有匹配子串并将String对象括号内文本转为大写
核心实现思路
不用提前统计括号匹配的数量,主流编程语言的正则API都支持动态替换能力:每次匹配到括号包裹的片段时,自定义处理逻辑将括号内的内容转为大写,再替换掉原括号+内容的片段即可。
匹配使用的正则规则为 \((.*?)\):
\(匹配左括号本身(.*?)为非贪婪捕获组,捕获左括号后到下一个右括号前的所有内容,避免多括号场景下跨括号匹配\)匹配右括号本身
Java 实现代码
你提到了StringUtils,默认按Java环境给出实现:
Java 9+ 版本(支持lambda替换)
import java.util.regex.Pattern; public class BracketContentUpper { // 预编译正则,多次调用时不需要重复编译,提升性能 private static final Pattern BRACKET_PATTERN = Pattern.compile("\\((.*?)\\)"); public static String convert(String input) { return BRACKET_PATTERN.matcher(input) // 每次匹配后取括号内的内容转大写,替换原片段 .replaceAll(match -> match.group(1).toUpperCase()); } public static void main(String[] args) { String testInput = "Hi (abc), how (a)re (You)?"; System.out.println(convert(testInput)); // 输出结果:Hi ABC, how Are YOU? } }
Java 8 及更低版本实现
import java.util.regex.Matcher; import java.util.regex.Pattern; public class BracketContentUpper { private static final Pattern BRACKET_PATTERN = Pattern.compile("\\((.*?)\\)"); public static String convert(String input) { Matcher matcher = BRACKET_PATTERN.matcher(input); StringBuffer resultBuffer = new StringBuffer(); // 循环遍历所有匹配项 while (matcher.find()) { // 替换当前匹配项为括号内内容转大写的结果 matcher.appendReplacement(resultBuffer, matcher.group(1).toUpperCase()); } // 拼接最后一个匹配项之后的剩余内容 matcher.appendTail(resultBuffer); return resultBuffer.toString(); } }
注意事项
上述实现仅适用于无嵌套括号的场景,如果输入内容存在(a(b)c)这类嵌套括号,正则无法正确匹配最内层/最外层括号内容,需要使用栈结构遍历字符单独处理。
内容的提问来源于stack exchange,提问作者jenny jenkins
相关产品推荐
相关产品推荐

