背景
想把文本中{"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));
}
}
没有评论