Помещение всех знаков препинания пробелами в SQL - PullRequest
0 голосов
/ 02 августа 2020

Я хочу преобразовать такой текст с помощью Snowflake SQL:

A very(!) punctuated sentence! A complicated/confusing regex.

в это:

'A very (  !  )  punctuated sentence !  A complicated / confusing regex . '

Двойные пробелы между пунктуацией - это нормально, потому что я могу сделать второй проход чтобы сжать пробелы. Список пунктуации:

.,&-_()[]{}-/:;%$@!*|?~=+"\'

Но если есть стандартный ярлык для всех знаков препинания, я бы подумал об этом. Я видел ответов , которые используют Java регулярное выражение, которое использует \p{Punct}. Но в своих тестах я не могу использовать идентификатор пунктуации и не вижу его в документации Snowflake.

У меня есть рабочая версия, от которой у меня текут глаза, и она даже не полностью выписана:

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 ]

1 голос
/ 02 августа 2020

Я вижу две потенциальные проблемы в вашем текущем подходе. Во-первых, в классе символов должен стоять дефис последний , иначе его следует экранировать. В настоящее время ваш класс символов имеет &-_, что означает включение всех символов между & и _, вероятно, не то, что вы намеревались. Во-вторых, в вашем регулярном выражении фактически нет первой группы захвата. Вы можете попробовать заменить его на \0 или просто поместить символ пунктуации в первую группу захвата, а затем использовать \1, как вы это уже делали.

SELECT REGEXP_REPLACE(
    'a very(!) punctuated sentence! A complicated/confusing regex?.',
    '([.,&_()[]{}-/:;%$@!*|?~=+"\'`-])', 
    ' \\1 '
) AS "result"
FROM yourTable;
0 голосов
/ 02 августа 2020
• 1000 basi c и расширенное использование , где [:punct:] - допустимый класс символов. Этот класс символов охватывает все знаки препинания, которые у меня были раньше, плюс <>^#, который подходит для моих целей.

Спасибо, Тим и Абра

...