在sql中用空格 Package 所有标点

ddrv8njm  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(242)

我想使用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: ?

而且,字符类似乎也不能使用反向引用。
有没有一种方法可以编写性能相对较好的查询,并允许读者轻松直观地解析标点列表(如上面的字符类中的标点列表)?

wb1gzix0

wb1gzix01#

我认为你目前的方法有两个潜在的问题。首先,连字符应该出现在字符类的最后,否则应该转义。当前,您的角色类 &-_ ,这意味着包含中间的每个字符 & 以及 _ ,可能不是你想要的。其次,regex实际上没有第一个捕获组。你可以试着用 \0 ,或者将标点符号放入第一个捕获组中,然后使用 \1 就像你刚才做的那样。

SELECT REGEXP_REPLACE(
    'a very(!) punctuated sentence! A complicated/confusing regex?.',
    '([.,&_()[]{}-/:;%$@!*|?~=+"\'`-])', 
    ' \\1 '
) AS "result"
FROM yourTable;
hpxqektj

hpxqektj2#

此解决方案非常有效,可读性非常强:

select regexp_replace(
  'a very(!) punctuated sentence! A complicated/confusing regex?.',
  '[[:punct:]]',
  ' \\0 '
)

我试蒂姆的答案时出错了 no argument for repetition operator: ? 这让我看到了使用posix基本用法和扩展用法的snowflakes文档 [:punct:] 是有效的字符类。那个字符类涵盖了我以前所有的标点符号,还有 <>^# 这对我来说很有用。
谢谢蒂姆和艾布拉

相关问题