如何用正则表达式提取以HALOENCRYPT(开头、)结尾的子串?
解决Java中提取HALOENCRYPT(...)格式子串的正则问题
你的问题核心是正则匹配时误用了贪婪模式,导致提取到超出目标范围的字符。以下是可行的解决方案:
正确的正则表达式
使用非贪婪匹配确保匹配到最近的闭合括号,正则表达式如下:
HALOENCRYPT\(([\s\S]*?)\)
各部分说明:
HALOENCRYPT\(:匹配固定前缀HALOENCRYPT(,括号(是正则特殊字符,必须用\转义[\s\S]*?:匹配括号内任意内容(包括换行符),[\s\S]覆盖所有空白与非空白字符,*?为非贪婪模式,遇到第一个)就停止匹配\):匹配闭合括号),同样需要转义
Java代码实现
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class HaloEncryptExtractor { public static void main(String[] args) { String input = "s#$_123 /HEC2w.,-&#--<strong>HALOENCRYPT(177ey7y37, 'zimba')</strong>,dnjekkq%12nnv<strong>HALOENCRYPT(ECRa12 _*,'grate')</strong>,eqn12&*;"; Pattern pattern = Pattern.compile("HALOENCRYPT\\(([\\s\\S]*?)\\)"); Matcher matcher = pattern.matcher(input); List<String> extractedList = new ArrayList<>(); while (matcher.find()) { // group(0)获取完整匹配的子串,即整个HALOENCRYPT(...) extractedList.add(matcher.group(0)); } // 输出结果 extractedList.forEach(System.out::println); } }
运行后会得到你期望的结果:
HALOENCRYPT(177ey7y37, 'zimba') HALOENCRYPT(ECRa12 _*,'grate')
问题原因说明
如果你的原有正则使用了贪婪匹配的.*,它会从第一个HALOENCRYPT(开始,一直匹配到字符串最后一个),导致把中间的HTML标签和其他无关内容都包含进来。换成非贪婪的*?后,匹配会在遇到第一个闭合括号时立即停止,精准提取每个独立的目标子串。
内容的提问来源于stack exchange,提问作者noob555
相关产品推荐
相关产品推荐

