如何在BigQuery中移除字符串中紧邻重复的子串
在BigQuery中移除紧邻重复的单词/短语
你的正则无法生效的核心问题有两个:
- 原正则
([ \\w]+)\\1要求重复部分和捕获组完全一致(包括末尾空格),但实际场景中重复短语是用空格分隔的(比如big black dog big black dog里,第一个短语末尾无空格,第二个短语前有空格),导致匹配失败。 - 正则未考虑换行等空白字符,你的字符串里存在换行分隔的重复(比如
friendly \n friendly),\\w和普通空格匹配无法覆盖这种情况。
正确解法
下面的代码可以精准匹配并移除所有紧邻重复的单词或多词短语,同时处理换行、多次重复等场景:
with text as ( select "The big black dog big black dog is a friendly friendly dog who who lives nearby nearby" as phrase ) select -- 两次嵌套替换,处理单次和多次重复(如dog dog dog → dog) REGEXP_REPLACE( REGEXP_REPLACE(phrase, r'(\\b(?:\\w+\\s+)*\\w+\\b)\\s+\\1', r'\\1'), r'(\\b(?:\\w+\\s+)*\\w+\\b)\\s+\\1', r'\\1' ) as cleaned_phrase from text
正则逻辑拆解
\\b:单词边界,确保捕获完整的单词/短语,避免部分字符误匹配(比如dogdogs不会被当成重复)(?:\\w+\\s+)*:非捕获组,匹配「单词+任意空白」的组合零次或多次,支持捕获多单词短语\\w+:匹配单个单词\\s+:匹配任意数量的空白字符(空格、换行、制表符都覆盖)\\1:引用之前捕获的短语,替换时只保留一次实例
输出结果
运行后得到目标字符串:
The big black dog is a friendly dog who lives nearby
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

