我想使用snowflake sql转换如下文本:
A very(!) punctuated sentence! A complicated/confusing regex.
对此:
'A very ( ! ) punctuated sentence ! A complicated / confusing regex . '
标点之间的双空格是可以的,因为我可以做第二遍压缩空白。标点列表是
.,&-_()[]{}-/:;%$@!*|?~=+"\'
但如果所有的标点符号都有一个标准的快捷方式,我会考虑的。我看到过使用java正则表达式的答案 \p{Punct}
. 但在我的测试中,我不能使用标点符号标识符,也不能在雪花文档中看到它。
我有一个工作版本,让我的眼睛流血,它甚至没有完全写出来:
select regexp_replace(
'a very(!) punctuated sentence! A complicated/confusing regex?.',
'(\\(|\\)|\\/|!|\\?)', -- only addresses (), /, !, ?, not the full list
' \\1 '
) as "result" from table
result: "a very ( ! ) punctuated sentence ! A complicated / confusing regex ? ."
由于某些原因,没有双空格,这使我对结果以及实现的可读性产生疑问
我的理解是,字符类的性能更高,更容易直观地解析。但这行不通:
select regexp_replace(
'a very(!) punctuated sentence! A complicated/confusing regex?.',
'[.,&-_()[]{}-/:;%$@!*|?~=+"\'`]',
' \\1 '
) as "result" from table
-- Error: no argument for repetition operator: ?
而且,字符类似乎也不能使用反向引用。
有没有一种方法可以编写性能相对较好的查询,并允许读者轻松直观地解析标点列表(如上面的字符类中的标点列表)?
2条答案
按热度按时间wb1gzix01#
我认为你目前的方法有两个潜在的问题。首先,连字符应该出现在字符类的最后,否则应该转义。当前,您的角色类
&-_
,这意味着包含中间的每个字符&
以及_
,可能不是你想要的。其次,regex实际上没有第一个捕获组。你可以试着用\0
,或者将标点符号放入第一个捕获组中,然后使用\1
就像你刚才做的那样。hpxqektj2#
此解决方案非常有效,可读性非常强:
我试蒂姆的答案时出错了
no argument for repetition operator: ?
这让我看到了使用posix基本用法和扩展用法的snowflakes文档[:punct:]
是有效的字符类。那个字符类涵盖了我以前所有的标点符号,还有<>^#
这对我来说很有用。谢谢蒂姆和艾布拉