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

如何用正则表达式提取以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.,-&amp;#--<strong>HALOENCRYPT(177ey7y37, 'zimba')</strong>,dnjekkq%12nnv<strong>HALOENCRYPT(ECRa12 _*,'grate')</strong>,eqn12&amp;*;";
        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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:33:23