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, '<.+?>','')
应该可以工作,但是在 Snowflake 中尝试时,它似乎在某些情况下切断了最后一个 'Text I care about',而在其他情况下根本没有显示任何结果。我不确定所使用的 regex snowflake 版本是否存在语法差异或其他问题,但如有任何建议,我们将不胜感激。
不优雅,但如果您知道要删除的所有特殊编码,也许您可以像这样列出它们?
select REGEXP_REPLACE('<li>Text I care about 3</li>', '(<)|(li>)|(/li>)','')
您的正则表达式有效,但它需要环顾四周。
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,'<.+?>','');
select regexp_replace2($SAMPLE2,'<.+?>','');
select regexp_replace2($SAMPLE3,'<.+?>','');
select regexp_replace2($SAMPLE4,'<.+?>','');
select regexp_replace2($SAMPLE5,'<.+?>','');
我编写了一个支持正则表达式环视的 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('<li>Text I care about 1</li>', '(\w+\s)+\d');
输出如下:
Text I care about 1
但这需要您的数据具有特定模式。
我正在尝试在 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, '<.+?>','')
应该可以工作,但是在 Snowflake 中尝试时,它似乎在某些情况下切断了最后一个 'Text I care about',而在其他情况下根本没有显示任何结果。我不确定所使用的 regex snowflake 版本是否存在语法差异或其他问题,但如有任何建议,我们将不胜感激。
不优雅,但如果您知道要删除的所有特殊编码,也许您可以像这样列出它们?
select REGEXP_REPLACE('<li>Text I care about 3</li>', '(<)|(li>)|(/li>)','')
您的正则表达式有效,但它需要环顾四周。
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,'<.+?>','');
select regexp_replace2($SAMPLE2,'<.+?>','');
select regexp_replace2($SAMPLE3,'<.+?>','');
select regexp_replace2($SAMPLE4,'<.+?>','');
select regexp_replace2($SAMPLE5,'<.+?>','');
我编写了一个支持正则表达式环视的 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('<li>Text I care about 1</li>', '(\w+\s)+\d');
输出如下:
Text I care about 1
但这需要您的数据具有特定模式。