Как работает REGEXP_REPLACE ниже? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть запрос в моем проекте, и он имеет REGEXP_REPLACE Я пытался найти, как он работает, выполняя поиск, но я нашел его как

w + Соответствует символу слова (то есть буквенно-цифровойили знак подчеркивания (_).

, но не может найти '"\w+\":', почему используются эти "" и что означает '{|}|"',''

UPDATE (SELECT data,data_value FROM  TEMP) t
SET t.DATA_VALUE=REGEXP_REPLACE(REGEXP_REPLACE(t.data, '"\w+\":',''),'{|}|"','');

можетподскажите пожалуйста как это работает?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Это выглядит как регулярное выражение для выделения ключей и заключения в квадратные скобки строки JSON - к сожалению, если это так, то это не работает во всех ситуациях.

Регулярное выражение

'"\w+\":'

будет соответствовать:

  • A " двойная кавычка;
  • \w+ одно или несколько слов (a-z или A-Z или 0-9 или _) символов;
  • \" еще одна двойная кавычка - примечание: символ \ не обязателен ;затем
  • A : двоеточие.

Итак:

REGEXP_REPLACE(
  '{"key":"value","key2":"value with \"quote"}',
  '"\w+":',   -- Pattern matched
  ''          -- Replacement string
)

Будет выводить:

{"value","value with \"quote"}

Второй шаблон {|}|" будет соответствовать символу {, } или " (и мог бы быть эквивалентно записан как [{}"]), поэтому:

REGEXP_REPLACE(
  '{"value","value with \"quote"}',
  '{|}|"',    -- Pattern matched
  ''          -- Replacement string
)

Выводит:

value,value with \quote

Это нормально, пока (как в моем примере) у вас не будет экранированных двойных кавычек (или фигурных скобок) в строке значения;в этом случае они также будут удалены, оставив escape-символ.

(Примечание: обычно вы не найдете его, но в ключ можно включить экранированные кавычки. Так что {"keywith\":quote":"value"} будет заменендо {quote":"value"}, а затем quote:value, что не является ожидаемым выводом.)

Если вы пытаетесь выполнить синтаксический анализ JSON (до Oracle 12), тогда вы можете использовать:

REGEXP_REPLACE(
  '{"key":"value","key2":"value with \"quote","keywith\":quote":"value with \"{}"}',
  '^{|"(\\"|[^"])+":(")?((\\"|[^"])+?)\2((,)|})',
  '\3\6'
 )

Какие выходы:

value,value with \"quote,value with \"{}

Или в Oracle 12 вы можете сделать:

SELECT *
FROM   JSON_TABLE(
         '{"key":"value","key2":"value with \"quote","keywith\":quote":"value with \"{}"}',
         '$.*' NULL ON ERROR
         COLUMNS (
           value VARCHAR2(4000) PATH '$'
         )
       )

Какие выходы:

VALUE
-----------------
value
value with "quote
value with "{}
0 голосов
/ 26 апреля 2018

пример ::: REGEXP_REPLACE (строка, шаблон [, замена_строки [, начальная_позиция [, nth_appearance [, соответствие_параметр]]]])

|is или (МОЖЕТ ЗНАЧИТЬ БОЛЬШЕ, ЧЕМ ОДИН АЛЬТЕРНАТИВНЫЙ), по крайней мере, как в {n,} как минимум n раз

https://www.techonthenet.com/oracle/functions/regexp_replace.php "где я получил информацию"

'"\ w + \":' почему используются эти "" и что означает "{|} |" ',' 'Соответствует символу слова (\ w) Один или несколько раз (+) это должно быть испорченоон пропускает нужное количество закрывающих скобок, помещая \ "w + \", они позволяют отображать ".Это выражение принимает одно выражение изменения, а затем использует его в качестве основы для следующего изменения.Удачи в выяснении всего остального.Регулярные выражения не так уж плохи, довольно интуитивно понятны, когда вы освоите основы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...