Реализация регулярного выражения в IBM i использует апострофы (вместо, например, косых черт) для разграничения строки регулярного выражения, т.е.

... where REGEXP_SUBSTR(MYFIELD,'myregex_expression')

Если я пытаюсь использовать апостроф внутри [группы] внутри выражения, это всегда приводит к ошибкам - вероятно, думая, что я даю заключительную цитату. Я пытался:
- избежать этого: \ '
- удвоение: '' (и утроение)

Нет радости Я не могу найти ничего релевантного в руководстве по IBM SQL или в поиске Google.

Мне действительно нужно это, например, разрешить имена типа О'Лири.

1
user11711727 18 Авг 2019 в 11:18

2 ответа

Лучший ответ

Одиночная кавычка может быть определена с помощью нотации \x27:

^[A-Z0-9_+\x27-]+
          ^^^^

Обратите внимание, что при использовании дефиса в выражении класса символов / скобок при использовании между некоторыми символами он образует диапазон между этими символами. Когда вы использовали ^[A-Z0-9_\+-\x27]+, вы определили диапазон между + и ', который является недопустимым диапазоном, поскольку + идет после ' в таблице Unicode.

1
Wiktor Stribiżew 19 Авг 2019 в 00:51

Спасибо Виктору Стрибизью за ответ в своем комментарии.

Есть пара «ошибок» для тех, кто может решить этот вопрос с такой же проблемой. Во-первых, вы должны указать шестнадцатеричное значение (предположительно Unicode), а не значение EBCDIC, которое вы бы использовали, например в обычном интерактивном SQL на IBM i. Так что в данном случае это действительно \ x27, а не \ x7D для апострофа. Предположительно это связано с тем, что функции REGEXP_ ... работают через Unicode даже для данных EBCDIC.

Во-вторых, может показаться, что шестнадцатеричное значение не может быть последним в наборе. Так что это работает:

^[A-Z0-9_\+\x27-]+ ... etc.

Но это не так

^[A-Z0-9_\+-\x27]+ ... etc.

Я не знаю, как выделить текст в примере кода, поэтому обращаю ваше внимание на то, что дефис является последним в первом примере и вторым по последнему во втором.

Если кто-нибудь знает, почему это не должно быть последним, мне было бы интересно узнать. [править: см. ответ Виктора по причине]

Кстати, использование двойных кавычек в качестве разделителя строк с апострофом в наборе не работало в этом контексте.

1
Unmutual 19 Авг 2019 в 01:12