regex 如何删除Snowflake列中字符串中的重复/重复单词

h79rfbju  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(162)

我在regexp概念方面相当菜鸟,我有下面的场景,方括号内的单词很少,它可能多次出现,我只需要保留其中一个单词,并应删除方括号。

现有格式:

|                                              TXT                                       | 
| -------------------------------------------------------------------------------------- | 
| This sentence has [num] [num] [num] [num] and there are [num] [num] in previous string |

我有这个上面的表与txt列,我需要应用一个regexp正则表达式函数来实现下面的输出。

期望输出:

|                           TXT                                       | 
| ------------------------------------------------------------------- | 
| This sentence has num and there are num in previous string |

你能帮我这个忙吗,因为这需要在sql查询上完成..不想用UDF得到任何答案
先谢了。
我已经尝试了下面的查询,可以获得第一个要保留的num,但无法实现我所期望的

查询:

select 
 regexp_replace(regexp_replace(regexp_replace(txt,'\\[\\w+\\]','REGEX_WORD',1,1,'c'),'\\[\\w+\\]',''),'REGEX_WORD',regexp_replace(regexp_substr(txt,'\\[\\w+\\]'),'\\[|\\]','')) working_model  from cte;

输出:

This sentence has num and there are in previous string
kyxcudwk

kyxcudwk1#

我不希望使用UDF得到任何答案
代码提供了比正则表达式更大的灵活性,因此有一些可能性正则表达式本身可能无法涵盖。
你可以把你的模式放在括号里(这些东西()对于那些称它们为“括号”的人来说),然后告诉它这个模式可以重复1次或更多次{1,}。如果你使用单引号'来结束你的字符串,记得在Snowflake中将反斜杠\\加倍。如果使用$$来终止字符串,则不需要使用双反斜杠。您可以使用\1作为替换来反向引用第一个捕获组。不幸的是,这意味着它保留了周围的方括号:[]

set s = (select 'This sentence has [num] [num] [num] [num] and there are [num] [num] in previous string');

select regexp_replace($s, '(\\[\\w+\\]\\s+){1,}', '\\1') as OUTPUT;
输出
这个句子有[num],前一个字符串中有[num]

你当然可以去掉所有的方括号,但是这种方法会在任何地方去掉它们,而不仅仅是在重复的单词上:

select replace(replace(regexp_replace($s, '(\\[\\w+\\]\\s+){1,}', '\\1'), ']'), '[') as OUTPUT;
输出
这个句子有num,前一个字符串中有num

这种方法还有一个问题,问题中没有提到,但是如果方括号中重复的单词发生了变化怎么办?

This sentence has [num] [foo] [num] [num]...

那么会发生什么,或者这真的不是一个问题?这些类型的捕获组只会检测方括号内的单词,而不是它们正在改变。在这种情况下,如上所示的regexp_replace将返回第一个捕获组,它将返回[num]

相关问题