2013-11-13 3 views
2

Я ищу регулярное выражение для захвата последнего значения в строке. Я скопировал пример данных, которые я ищу для анализа. Я использую синтаксис оракула.Использование регулярного выражения Oracle

Пример данные:

||CULTURE|D0799|D0799HTT| 
||CULTURE|D0799|D0799HTT|| 

Ищу раздеть последнее значение перед последним набором труб:

D0799HQTT 
D0799HQTT 

Я могу создать REGEXP_SUBSTR, возвращающую КУЛЬТУРУ:

REGEXP_SUBSTR(c.field_name, '|[^|]+|') 

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

+0

Вы пробовали разделить строку и набрать последний не пустой элемент? –

+1

Пример: 'array = str.split ('|'); int i = array.length; while (array [i] .isEmpty()) {i--; } array [i] = yourLastValue; 'Надеюсь, что это ясно, что я написал. ;) –

+0

@KamilW. Как это отвечает на вопрос (разделение строки в Oracle с использованием регулярных выражений)? –

ответ

1

Рассмотрим следующий Regex ...

(?<=\|)[\w\d]*?(?=\|*$) 

Удачи!

+1

Вы уверены, что Oracle поддерживает lookahead? –

3

Вы можете попробовать это:

select rtrim(regexp_substr('||CULTURE|D0799|D0799HTT||', 
        '[[:alnum:]]+\|+$'), '|') 
from dual; 

Или так:

select regexp_replace('||CULTURE|D0799|D0799HTT||', 
        '(^|.*\|)([[:alnum:]]+)\|+$', '\2') 
from dual; 

Here is a sqlfiddle demo

+0

Возможно, это проще для «|| КУЛЬТУРНЫЕ СУБП | МЕЖДУНАРОДНЫЕ ИСПЫТАНИЯ S.A. | ISLAND TEST_PEACE |» Я хочу вернуть «ISLAND TEST_PEACE». Есть ли у вас какие-либо предложения относительно того, как принимать во внимание пробелы и специальные символы? – user2989011

+0

Вместо '[[: alnum:]]' используйте свой собственный класс, т. Е. '[A-zA-Z0-9 _]' –

+0

ах очень хорошо! Большое вам спасибо, вы помогли больше узнать о регулярных выражениях. – user2989011

2

Это, вероятно, лучше, чтобы вытащить все символы, которые не являются трубы, а не предполагать, что они будут вписываться в специальный набор символов:

select regexp_replace(regexp_substr('||CULTURE SUBS|INTERNATIONAL TESTING S.A.|ISLAND TEST_PEACE|', '[^|]+\|+$'), '\|', '') from dual; 
0
SELECT REPLACE 
     (
      REGEXP_SUBSTR(str, '\w+\W{0,}$') 
     , '|' 
     ) AS result 
FROM 
(
     SELECT '||CULTURE|D0799|D0799HTT|' AS str FROM DUAL UNION ALL 
     SELECT '||CULTURE|D0799|D0799HTT||' AS str FROM DUAL 
) 
; 
Смежные вопросы