Oracle regex_replace не работает должным образом - PullRequest
0 голосов
/ 23 апреля 2020

У меня следующий запрос SQL (Oracle 18 c):

SELECT 
    --FIRST
    translate(
        ' sOmE tEsT


                   eNdOfLiNe', 
        chr(10)||chr(11)||chr(13), 'replText'
    ) "Result1",

    --SECOND
    regexp_replace(
        ' sOmE tEsT


                   eNdOfLiNe',
        '[\x0A|\x0B|`\x0D]', 'replText'
    ) "Result2",

    --THIRD
    regexp_replace(
        ' sOmE tEsT


                   eNdOfLiNe',
        '[\r\n\t]', 'replText', 1, 0
    ) "Result3"
FROM dual

Я хотел бы заменить все вкладки, возврат каретки и индикаторы новой строки новой строкой, но похоже, что регулярное выражение заменить не работает (возвращает исходный текст). Я действительно сожалею о форматировании, но мне нужно обработать текст в точном формате, как указано выше, с \r \n \t смешанными символами.

Вот скрипка: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=63834f9bcab93136635366f18c375b13

I я учусь Oracle прямо сейчас и не понимаю, почему второе и третье решение возвращает исходный текст. Первое решение, похоже, работает, но я бы хотел добиться того же эффекта в решениях SECOND и THIRD. Что я пропустил?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Я почти уверен, что Oracle не разрешает escape-последовательности в классе символов. Я считаю, что это то, что вы должны сделать. В ответ на ваш комментарий к другому ответу здесь и, как вы учитесь, регулярное выражение, безусловно, не регулярное выражение. Особенно реализация Oracle.

РЕДАКТИРОВАТЬ, чтобы объяснить регулярное выражение: Шаблон регулярного выражения строит строку класса символов регулярного выражения, содержащую 3 символа, следовательно, конкатенацию. Вы не можете просто иметь escape-символы в регулярном выражении, так как тогда регулярное выражение будет принимать эти символы как часть самого шаблона класса символов.

SELECT REGEXP_REPLACE(
' sOmE tEsT


                       eNdOfLiNe', '['||CHR(9)||CHR(10)||CHR(13)||']', 'X') Result3
FROM dual;

RESULT3                       
------------------------------
 sOmE tEsTXXXXXXXX   eNdOfLiNe
1 row selected.
0 голосов
/ 23 апреля 2020

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

  select  regexp_replace(
   ' sOmE tEsT


               eNdOfLiNe',
    chr(10)||'|'||chr(11)||'|'||chr(13), 'replText') "Result3"
    FROM dual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...