Как использовать REGEX_SUBSTR - PullRequest
0 голосов
/ 02 мая 2020

Мне нужно извлечь подстроку из длинной строки. Я пробовал следующий запрос, но он не работает, он возвращает мне NULL, я хочу извлечь первое значение 12 между <cc> и </cc>

select regexp_substr('<CC>3</CC><CN>ROSSI</CN><NO>MARIO</NO><IN>VIA DELLE MIMOSE 4</IN>,'<CN>[^</CN>]*') 
"REGEXPR_SUBSTR"
FROM DUAL;

, которые я получаю в результате <CN>ROSSI но я хочу также исключить также <CN>, любое предложение?

Ответы [ 3 ]

5 голосов
/ 02 мая 2020

Не используйте регулярное выражение для анализа XML данных; используйте правильный XML синтаксический анализатор:

SELECT t.*
FROM   XMLTABLE(
         '/root'
         PASSING XMLTYPE(
           '<root>'
           || '<CC>3</CC><CN>ROSSI</CN><NO>MARIO</NO><IN>VIA DELLE MIMOSE 4</IN>'
           || '</root>'
         )
         COLUMNS
           cc NUMBER PATH './CC',
           cn VARCHAR2(20) PATH './CN',
           no VARCHAR2(20) PATH './NO',
           "IN" VARCHAR2(50) PATH './IN'
       ) t

который выводит:

CC | CN    | NO    | IN                
-: | :---- | :---- | :-----------------
 3 | ROSSI | MARIO | VIA DELLE MIMOSE 4

db <> скрипка здесь

0 голосов
/ 02 мая 2020

Используйте подвыражение (подходящая группа, заключенная в скобки), чтобы получить то, что вы хотите:

SELECT REGEXP_SUBSTR('<CC>3</CC><CN>ROSSI</CN><NO>MARIO</NO><IN>VIA DELLE MIMOSE 4</IN>',
                     '<CN>(.*?)</CN>', 1, 1, NULL, 1) 
  FROM DUAL;

Здесь мы говорим REGEXP_SUBSTR, что мы хотим сопоставить строку, которая начинается с <CN> , сопровождается подвыражением любого количества любых символов (.*) и заканчивается, когда найдено </CN>. Поскольку в регулярном выражении есть только одно подвыражение ((.*?)), это подвыражение номер 1, на что указывает последний параметр, переданный REGEXP_SUBSTR выше.

db <> fiddle здесь

0 голосов
/ 02 мая 2020

Вы можете получить ROSSI, используя

select regexp_substr('<CC>3</CC><CN>ROSSI</CN><NO>MARIO</NO><IN>VIA DELLE MIMOSE 4</IN>','<CN>([^<]*)</CN>', 1, 1, NULL, 1)

См. онлайн Oracle демо .

Регулярное выражение <CN>([^<]*)</CN> соответствует <CN>, затем захватывает в группу 1 любой ноль или более символов, отличных от <, а затем сопоставляет </CN>. Только захваченная часть возвращается из-за последнего аргумента 1.

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