背景

想把文本中{"text":"拍的太漂亮了[玫瑰]爱你[玫瑰][玫瑰]biubiubiu"}中只要方括号内的数据包括方括号结果为[玫瑰][玫瑰][玫瑰]

结果

SELECT     concat_ws('',REGEXP_EXTRACT_ALL('{"text":"拍的太漂亮了[玫瑰]爱你[玫瑰][玫瑰]biubiubiu"}', '\\[([^\\]]+)\\]', 0))

UDF函数

import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexpExtractAllUDF extends UDF {
    // 缓存正则表达式对象,提升性能[5,9](@ref)
    private Pattern lastPattern = null;
    private String lastRegex = null;

    public List<String> evaluate(String input, String regex) {
        return evaluate(input, regex, 0); // 默认捕获整个匹配
    }

    public List<String> evaluate(String input, String regex, int groupIndex) {
        // 处理空输入[5](@ref)
        if (input == null || regex == null) {
            return new ArrayList<>();
        }

        // 重用已编译的正则表达式[5,9](@ref)
        if (!regex.equals(lastRegex)) {
            lastRegex = regex;
            lastPattern = Pattern.compile(regex);
        }

        Matcher matcher = lastPattern.matcher(input);
        List<String> matches = new ArrayList<>();

        // 循环提取所有匹配项[9,11](@ref)
        while (matcher.find()) {
            try {
                if (matcher.groupCount() >= groupIndex) {
                    matches.add(matcher.group(groupIndex));
                }
            } catch (IndexOutOfBoundsException e) {
                // 忽略无效分组索引
            }
        }
        return matches;
    }

    public static void main(String[] args) {
        String input="a!b[[测试@123]c[d_e]";
        String regex="\\[([^\\]]+)\\]";
        System.out.println(new RegexpExtractAllUDF().evaluate(input,regex));

    }
}