如何优雅提取字符串中左括号后至星号前的内容?
问题解决方法
首先,你原来的正则表达式存在错误:\\.*是匹配任意数量的点字符,而非任意字符,因此无法覆盖左括号前的所有内容(比如示例里的1.2.3 中的空格、数字都匹配不到)。另外Matcher.matches()返回false是因为这个方法要求整个字符串完全匹配正则,而你的正则是两种独立的匹配模式(左括号前内容/星号后内容),整个字符串不可能符合其中一种,所以返回false——但其实replaceAll不需要依赖matches()的结果,只要正则正确就能完成替换。
下面是两种优雅的解决方式:
方式一:用捕获组直接提取目标内容(推荐)
这种方式语义更清晰,直接定位并提取左括号(到星号*之间的内容,避免替换操作的冗余:
String input = "1.2.3 (1.234*xY)"; // 正则解释:匹配任意内容直到(,然后捕获*之前的所有内容,再匹配*后的任意内容 Pattern pattern = Pattern.compile(".*\\(([^*]+)\\*.*"); Matcher matcher = pattern.matcher(input); if (matcher.find()) { String result = matcher.group(1); System.out.println(result); // 输出:1.234 }
方式二:修正replaceAll的正则表达式
把原来的\\.*改成.*(匹配任意字符,除换行),这样就能正确替换掉左括号前的所有内容和星号后的所有内容:
String input = "1.2.3 (1.234*xY)"; String result = input.replaceAll(".*\\(|\\*.*", ""); System.out.println(result); // 输出:1.234
补充说明
- 如果需要处理多行字符串,给正则加上
Pattern.DOTALL标志(让.匹配换行符)。 - 如果输入中存在多个
(或*,可以调整正则为.*?\\(([^*]+)\\*.*(用.*?非贪婪匹配第一个(),确保提取的是第一个(到第一个*之间的内容。
内容的提问来源于stack exchange,提问作者mlg dog
相关产品推荐
相关产品推荐

