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

如何用Java正则提取每个St与En之间的独立内容?

解决正则贪婪匹配问题,捕获独立内容

原问题中,你的正则表达式St(?s)(.*)En使用了贪婪匹配的.*,它会尽可能匹配最多的内容,所以会从第一个St一直匹配到最后一个En,导致整个字符串被捕获。要获取每组St与对应En之间的独立内容,需要做以下调整:

关键修改点

将贪婪匹配的.*替换为非贪婪匹配的.*?,让正则匹配到最近的En就停止,同时精准定位St和En的实际出现形式(比如示例中被<b>标签包裹的情况)。

修改后的代码

String vartext = "<b>St</b> 28828 <b>En</b>, <b>St</b> 217n <b>En</b>, <b>St</b> 38729mdnj dnj]spw <b>En</b>";
// 正则匹配<b>St</b>和<b>En</b>之间的内容,自动忽略前后空白
Pattern patt = Pattern.compile("<b>St</b>\\s*(.*?)\\s*<b>En</b>", Pattern.DOTALL);
Matcher matc = patt.matcher(vartext);
boolean found = false;
while (matc.find()) {
    found = true;
    // 直接获取分组1的内容,就是目标文本
    Log.d("LogCalc", matc.group(1));
}
if (!found) {
    Log.d("LogCalc", "Nothing");
}

代码说明

  • Pattern.DOTALL:等价于原正则中的(?s),让.可以匹配换行符,如果你的内容中没有换行,可移除该参数。
  • \\s*:匹配内容前后的任意空白字符(空格、制表符等),避免捕获到多余的空格。
  • .*?:非贪婪匹配模式,会匹配到最近的<b>En</b>就停止,从而逐个捕获每组独立的内容。

如果St和En不一定被<b>标签包裹,可将正则调整为St\\s*(.*?)\\s*En,同样通过matc.group(1)获取目标内容。

内容的提问来源于stack exchange,提问作者Felipe Vidal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:17:41