REGEXP_REPLACE 字符串以雪花中的特定子字符串开头和结尾

Posted

技术标签:

【中文标题】REGEXP_REPLACE 字符串以雪花中的特定子字符串开头和结尾【英文标题】:REGEXP_REPLACE Strings Starting and Ending with Specific Substrings in Snowflake 【发布时间】:2021-12-17 03:23:52 【问题描述】:

我正在尝试在 Snowflake 的视图中创建一个列,以替换我不关心的字符串之间的任何字符串。

这本质上是为了从文本中去除 html 格式。 举个例子:

<ul>
<li>Text I care about 1
<li>Text I care about 2</li>
<li>Text I care about 3</li>
</ul>

最终应该是这样的:


Text I care about 1
Text I care about 2
Text I care about 3

根据我看到的模式,我认为如果我可以消除任何以 &lt 开头并以 > 结尾的字符串,我应该能够达到我正在寻找的结果。

在不同网站的测试中,这似乎是一种表达方式 REGEXP_REPLACE(originaltext, '&lt.+?>','') 应该可以工作,但是在 Snowflake 中尝试时,在某些情况下它似乎切断了最后一个“我关心的文本”,而在其他情况下根本没有显示任何结果。我不确定正在使用的正则表达式雪花版本中是否存在语法差异或其他问题,但我们将不胜感激。

【问题讨论】:

【参考方案1】:

您的正则表达式有效,但它需要环顾四周。

set sample1 = '<ul>';
set sample2 = '<li>Text I care about 1';
set sample3 = '<li>Text I care about 2</li>';
set sample4 = '<li>Text I care about 3</li>';
set sample5 = '</ul>';

select regexp_replace2($SAMPLE1,'&lt.+?>','');  
select regexp_replace2($SAMPLE2,'&lt.+?>','');
select regexp_replace2($SAMPLE3,'&lt.+?>','');
select regexp_replace2($SAMPLE4,'&lt.+?>','');
select regexp_replace2($SAMPLE5,'&lt.+?>','');

我编写了一个支持正则表达式环视的 UDF 库。它尝试在支持环视的同时逼近内置的雪花正则表达式函数。 UDF 的名称与 SQL 示例中所示的带后缀“2”的内置正则表达式函数的名称相同。

https://github.com/GregPavlik/SnowflakeUDFs/tree/main/RegularExpressions

【讨论】:

完美!我将花更多时间熟悉环视和您的代码在做什么,但这正是我想要做的。谢谢!【参考方案2】:

不优雅,但是如果您知道要删除的所有特殊编码,也许您可​​以这样列出它们?

select REGEXP_REPLACE('<li>Text I care about 3</li>', '(<)|(li>)|(/li>)','')

【讨论】:

【参考方案3】:

您的挑战在于您使用的是 LAZY 量词 (.+?),而根据我们的 docs,Snowflake 不支持它:

Patterns support the full POSIX ERE (Extended Regular Expression) syntax. For details, see the POSIX basic and extendedsection (in Wikipedia).

Wikipedia 链接显示 LAZY 包含在 ERE 标准中,但它是一个扩展。

在您的情况下,您可以使用 REGEXP_SUBSTR,如下所示:

SELECT REGEXP_SUBSTR('<li>Text I care about 1</li>', '(\\w+\\s)+\\d');

输出如下:

Text I care about 1

但这需要您的数据具有特定的模式。

【讨论】:

以上是关于REGEXP_REPLACE 字符串以雪花中的特定子字符串开头和结尾的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 REGEXP_REPLACE 替换特定条件下的重复单词?

REGEXP_REPLACE 捕获组

Postgresql 中的 REGEXP_REPLACE 不是子字符串

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]

如何从雪花中的数据库模式中检索所有表名

雪花 - 检查模式并返回该模式中的子字符串