You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅提取字符串中左括号后至星号前的内容?

问题解决方法

首先,你原来的正则表达式存在错误:\\.*是匹配任意数量的点字符,而非任意字符,因此无法覆盖左括号前的所有内容(比如示例里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:45:30