REGEXP_REPLACE Snowflake 中以特定子字符串开始和结束的字符串

REGEXP_REPLACE Strings Starting and Ending with Specific Substrings in Snowflake

我正在尝试在 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

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

在不同的网站上测试似乎表达 REGEXP_REPLACE(originaltext, '&lt.+?&gt;','') 应该可以工作,但是在 Snowflake 中尝试时,它似乎在某些情况下切断了最后一个 'Text I care about',而在其他情况下根本没有显示任何结果。我不确定所使用的 regex snowflake 版本是否存在语法差异或其他问题,但如有任何建议,我们将不胜感激。

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

select REGEXP_REPLACE('&lt;li&gt;Text I care about 3&lt;/li&gt;', '(&lt;)|(li&gt;)|(/li&gt;)','')

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

set sample1 = '&lt;ul&gt;';
set sample2 = '&lt;li&gt;Text I care about 1';
set sample3 = '&lt;li&gt;Text I care about 2&lt;/li&gt;';
set sample4 = '&lt;li&gt;Text I care about 3&lt;/li&gt;';
set sample5 = '&lt;/ul&gt;';

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

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

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

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

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

维基百科 link 显示 LAZY NOT 包含在 ERE 标准中,但它是扩展吗。

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

SELECT REGEXP_SUBSTR('&lt;li&gt;Text I care about 1&lt;/li&gt;', '(\w+\s)+\d');

输出如下:

Text I care about 1

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