如何用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
相关产品推荐
相关产品推荐

