Привет, я новичок в Hana, и у меня есть работа по преобразованию сценария Hana SQL в снежинку, но я не могу понять следующую вещь \b(?!substring|substr|left|right)[a-z_]+\b, заданную в регулярном выражении. Я несколько раз читал, но substr, left и right - это методы, но здесь это не похоже на метод. Ниже приведен код

SELECT REPLACE(
            REPLACE_REGEXPR(
                            '("[a-z_]+?"|\b(?!substring|substr|left|right)[a-z_]+\b)' FLAG 'imU' IN :WORDS WITH '__PREFIX__\1' OCCURRENCE ALL),
                            '__PREFIX__', :p_alias||'.') 
                            INTO WORDS FROM SYS.DUMMY;
1
Ravindra Mishra 3 Сен 2020 в 11:13

2 ответа

Лучший ответ

Ответ JGNI был явно правильным; Сначала я упустил из виду негативный взгляд на будущее. Обновленный ответ содержит исправленное объяснение правил замены.


Как упоминалось в моем комментарии, эта команда REPLACE_REGEXPR ищет разные ключевые слова (например, SUBSTRING, SUBSTR, LEFT, RIGHT) и любые слова, которые не эти ключевые слова заменяет его на __PREFIX__ + найденное не ключевое слово.

Итак, если строка ввода будет выглядеть так:

SUBSTRING ( посмотрите налево и направо перед переходом улицы )

Команда найдет ключевые слова, выделенные жирным шрифтом , и вернет строку

SUBSTRING ( __PREFIX__посмотрите слева __PREFIX__и справа __PREFIX__перед __PREFIX__crossing __PREFIX__the __PREFIX__street )

Чтобы увидеть живую демонстрацию, посмотрите этот пример на regex101.com.

Итак, что делает команда. Но OP спросил для чего это ?

Исходя из предоставленного фрагмента кода, на этот вопрос невозможно ответить. Видя, что команда работает с некоторыми ключевыми словами SQL, мы можем предположить, что входная строка будет содержать код SQL и что цель команды - каким-то образом обработать этот код.

Но помимо этого - даже если речь идет о коде SQL или каком-либо другом языке - спекуляции становятся просто беспочвенным воображением.

Лучше всего получить ответ на «для чего это?» спросить первоначального автора кода.

Что я могу сказать с уверенностью, так это то, что это не тот фрагмент кода, который очень часто используется в средах HANA. Это специфическая нестандартная кодировка.

1
Lars Br. 4 Сен 2020 в 02:36

Добро пожаловать в чудесный мир регулярных выражений, совместимых с Perl. Компьютерный язык, наследие Perl компьютерному программированию.

Вы можете узнать, что это делает, прочитав онлайн-документацию Perl для регулярных выражений, но вкратце: -

\b(?!substring|substr|left|right)[a-z_]+\b
  • \ b соответствует границе слова, которая определяется как точка между символом слова и символом без слова в любом порядке. Какие символы являются словесными символами, предопределено вашей системой, но в целом их можно рассматривать как буквы, числа и символ '_'.
  • (?! запускает отрицательный взгляд вперед. Это означает, что в текущей точке строки то, что появляется в скобках, не может появиться в строке
  • ... | ... Это альтернатива. Так что один или другой может соответствовать
  • [a-z _] + Класс символов, соответствующий строчной букве в диапазоне от a до z. С + означает совпадение 1 или более раз

Собирая все это вместе, мы можем найти слово, если это слово не является ни подстрокой, ни подстрокой, ни левым, ни правым

2
JGNI 3 Сен 2020 в 08:35