2016-05-05 2 views
0

У меня есть строка 'TICKER: IBM IBM Corporation Inc.' и я хочу удалить тикер и его значение и захватить только оставшиеся в Oracle PL/SQL.Oracle PL/SQL regexp_replace для нескольких слов

Так что я сделал этот запрос, но он не работает так, как я предполагал:

SELECT REGEXP_REPLACE(
      'TICKER: IBM IBM Corporation Inc.', 
      '(.*):[[:space:]](.*)[[:space:]](.*)', '\3') 
     FROM dual; 

Я надеялся, что «\ 3» даст мне «IBM Corporation Inc.» но я получаю только «Инк» в результате.

REGEXP_REPLACE('TICKER:IBMIBMCORPORATIONINC.','(.*):[[:SPACE:]](.*)[[:SPACE:]](.*)','\3') 
----------------------------------------------------------------------------- 
Inc.                      

1 rows selected 

Update:

SELECT REGEXP_REPLACE(
     'TICKER: IBM IBM Corporation Inc.', 
     '(.*):[[:space:]](.*)[[:space:]](.*)', '\1|\2|\3') 
    FROM dual; 

Результат:

REGEXP_REPLACE('TICKER:IBMIBMCORPORATIONINC.','(.*):[[:SPACE:]](.*)[[:SPACE:]](.*)','\1|\2|\3') 
-------------------------------------------------------------------------------- 
TICKER|IBM IBM Corporation|Inc. 

Что я упускаю в регулярном выражении?

Спасибо.

+0

Вопрос: Вы пробовали '' \ 2''? См. Также: https://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_posix001.htm#BABJDBHB – paulsm4

ответ

2
SELECT REGEXP_REPLACE(
     'TICKER: IBM IBM Corporation Inc.', 
     '(.*):[[:space:]]([^ ]*)[[:space:]](.*)', '\3') 
    FROM dual; 

Ваше второе выражение захвата захватывало все, включая следующее пространство.

Я должен упомянуть, что я тестировал в Oracle, а не PL/SQL. Я бы подумал, что не было бы никакой разницы.

PS: следующий чередуется работа, а также:

-- using only one capturing expression 
SELECT REGEXP_REPLACE(
     'TICKER: IBM IBM Corporation Inc.', 
     '.*: [^ ]* (.*)', '\1') 
    FROM dual; 

    -- using no capturing expressions 
    SELECT REGEXP_REPLACE(
     'TICKER: IBM IBM Corporation Inc.', 
     '.*: [^ ]* ', '') 
    FROM dual; 
+0

Большое спасибо. Отлично работает. – JKK

+0

Я думал по тем же линиям замены первых двух слов на NULL, считая, что они всегда есть, а значение (символ?) Всегда будет 1 слово): '' \ w +: \ w + '' –

+1

Должно, немного привязавшись к началу строки: ''^\ w +: \ w + ''. –

1
SELECT REGEXP_REPLACE(
      'TICKER: IBM IBM Corporation Inc.', 
      '^(.*?):\s(\S*)\s(.*)$', 
      '\3' 
     ) 
FROM DUAL; 

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

SELECT REGEXP_REPLACE(
      'TICKER: IBM IBM: Corporation Inc.', 
      '^(.*?):[[:space:]](.*?)[[:space:]](.*)', 
      '\3' 
     ) 
FROM DUAL; 
+0

Вряд ли, но никто не знает, попробуйте с названием компании, содержащим двоеточие: '' TICKER: IBM: IBM Co: rporation: Inc.''. Показывается, что запрос должен быть запущен, чтобы сначала проверить двоеточия в данных. –

+0

Хорошая точка описания, содержащая двоеточие. Кажется, ваш запрос обрабатывает его отлично. Благодарю. +1 – JKK

+1

@JKK Всегда ожидайте неожиданного! В зависимости от источника данных и того, насколько хорошо он (или, скорее всего, нет), проверен, все виды crud могут быть приняты и закончены в базе данных. Всегда делайте некоторые проверки здравомыслия против данных, прежде чем делать предположения, такие как «названия компаний никогда не будут содержать двоеточие» :-) –

Смежные вопросы