hive 正则 重复文本
([\\u4E00-\\u9FA5a-z0-9]+?)\\1{2,}
这个 Hive 正则表达式 ([\\u4E00-\\u9FA5]+?)\\1{4,} 的核心功能是:匹配并找出连续重复出现 5 次或 5 次以上的同一个中文字符或中文词组(例如:“哈哈哈哈哈” 或 “测试测试测试测试测试”)。
下面为您逐符号拆解其具体的运行逻辑:
一、 表达式分段解析## 1. 第一部分:([\u4E00-\u9FA5]+?)(捕获组与懒惰匹配)
- [\u4E00-\u9FA5]:这是匹配中文字符的经典 Unicode 编码区间。因为在 Hive/Java 字符串中反斜杠是转义符,所以需要双反斜杠 \ 来表示正则里的单反斜杠。 [1, 2]
- +?(懒惰匹配):+ 表示匹配 1 次或多次中文。后面的 ? 开启了“懒惰(非贪婪)模式”,意思是让捕获组尽可能少地匹配字符,通常会先尝试只匹配 1 个汉字。
- ()(捕获组):将匹配到的这段中文组合成一个整体,并标记为 第一个捕获组(Group 1),供后面引用。 [3]
2. 第二部分:\1{4,}(反向引用与重复次数)
- \1(反向引用):代表精确复制第一个括号 () 里实际匹配到的文本。
- {4,}:表示前面的内容(即 \1 代表的文本)至少重复出现 4 次,上不封顶。
二、 为什么是“重复 5 次以上”?
因为第一部分本身已经出现了 1 次,后面的 \1{4,} 要求它再重复 至少 4 次。
计算公式:1 (基础文本) + 4 (至少重复次数) = 5 (总共至少出现 5 次)。
三、 实际匹配示例
由于 +? 的懒惰特性,引擎会优先尝试以单字进行重复匹配:
| 文本数据 | 是否匹配 | 匹配到的具体内容 | 说明 |
|---|---|---|---|
| 哈哈哈哈哈 | 是 | 哈哈哈哈哈 | 组 1 捕获 哈,后面重复了 4 次 哈 |
| 哈哈哈哈 | ❌ 否 | 无 | 只重复了 3 次,未达到 {4,} 最少 4 次的要求 |
| 点赞点赞点赞点赞点赞 | 是 | 点赞点赞点赞点赞点赞 | 组 1 捕获 点赞,后面重复了 4 次 点赞 |
| 刷屏了啊啊啊啊啊啊啊 | 是 | 啊啊啊啊啊啊啊 | 能够成功提取出其中连续重复的中文部分 |
四、 在 Hive SQL 中的常见应用场景
该正则通常用于垃圾数据清洗、恶意刷屏文本检测、弹幕过滤等场景:
-- 1. 过滤掉包含汉字恶意重复 5 次以上的刷屏评论SELECT comment FROM t_comment WHERE comment NOT RLIKE '([\u4E00-\u9FA5]+?)\1{4,}';
-- 2. 将重复的汉字压缩(例如把 "好好好好好" 替换为 "好")-- 注意:Hive 中反向引用在替换时通常用 $1SELECT REGEXP_REPLACE('重要的事情说三遍:懂懂懂懂懂!', '([\u4E00-\u9FA5]+?)\1{4,}', '$1');-- 输出结果: "重要的事情说三遍:懂!"
示例
SELECT keyword from (
SELECT '呼啦啦啦啦啦是什么歌' as keyword
UNION
SELECT '手机手机手机手机壳' as keyword
UNION
SELECT 'abababababab词' as keyword
UNION
SELECT 'cccccccc词' as keyword
UNION
SELECT '111111111词' as keyword
UNION
SELECT '1231231231234词' as keyword
UNION
SELECT '哈第二季免费视频' as keyword
) t
WHERE keyword REGEXP('([\\u4E00-\\u9FA5a-z0-9]+?)\\1{2,}')
LIMIT 500;
作者:brookin
出处:http://www.cnblogs.com/brookin/
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
出处:http://www.cnblogs.com/brookin/
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

浙公网安备 33010602011771号