В PostgreSQL есть тип данных BLOB, называемый bytea. Это просто массив байтов.
Литералы bytea выводятся следующим образом:
'\\037\\213\\010\\010\\005`Us\\000\\0001.fp3\'\\223\\222%'
См. Документы PostgreSQL для полного определения формата.
Я пытаюсь создать регулярное выражение Perl , которое будет соответствовать любой такой строке.
Он также должен соответствовать стандартным строковым литералам ANSI SQL, таким как 'Joe'
, 'Joe''s Mom'
, 'Fish Called ''Wendy'''
Он также должен соответствовать варианту с обратной косой чертой: 'Joe\'s Mom'
,.
Первый подход (показанный ниже) работает только для некоторых представлений байтов.
s{ ' # Opening apostrophe
(?: # Start group
[^\\\'] # Anything but a backslash or an apostrophe
| # or
\\ . # Backslash and anything
| # or
\'\' # Double apostrophe
)* # End of group
' # Closing apostrophe
}{LITERAL_REPLACED}xgo;
Для других (более длинных, со многими избежавшими апострофами, Perl выдает следующее предупреждение:
Превышен комплексный предел рекурсии регулярного подвыражения (32766) в строке ./sqa.pl, <> строка 1.
Так что я ищу лучшее (но все еще основанное на регулярных выражениях) решение, оно, вероятно, требует некоторой алхимии регулярных выражений (избегая обратных ссылок и всего).