2014-02-20 3 views
1

Я не понимаю, как получить «n-й матч шаблона, начиная с конца строки». Я читал, но не могу применить.Oracle regexp Непонимание

Столбца Я работаю с являются именами каталогов, которые выглядят, как правило, нравятся:

I:\044\LOGFILE\aw_34\ 

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

SELECT REGEXP_SUBSTR(col_name, '\\[^\]+\\$') 

Я думаю, что я спрашиваю здесь: «начало в конце значения в имя_столбце, вернуть первый экземпляр 1 или более не обратный косой черты символы, которые лежат между двумя обратными косыми чертами ».

Однако я не могу использовать разумную комбинацию параметров параметров, чтобы получить только второе имя папки ('\ LOGFILE \' в этом примере). Я пробовал:

SELECT REGEXP_SUBSTR(col_name, '\\[^\]+\\$', 1, 2) 

возвращает NULL. Кажется, я на самом деле не прошу «начать в конце строки и найти второе появление шаблона». Таким образом, я прибегал к сопоставлению образцу последних двух папок:

SELECT REGEXP_SUBSTR(col_name, '\\[^\]+\\[^\]+\\$') 

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

Это работает, но не помогает мне понять основную ошибку в использовании

REGEXP_SUBSTR(col_name, '\\[^\]+\\$', 1, 2) 

или еще более «прямой» способ вытаскивания только матч мне нужно («\ LOGFILE \» в этом примере). Что не так?

+0

+1 для хорошо объясненного вопроса – Incognito

ответ

2

Ваша попытка REGEXP_SUBSTR(col_name, '\\[^\]+\\$', 1, 2) не работает, потому что нет двух совпадений, которые заканчиваются на конце строки $ - может быть не более одного такого соответствия (любое другое совпадение не находится в конце строки, по определению).

Я хотел бы попробовать что-то вроде

REGEXP_SUBSTR(col_name, '(\\[^\]+){2}\\$') 

затем извлечь первую часть этого ... Обратите внимание, это немного отличается от того, что у вас было.

Альтернативно, в более поздних версиях Oracle (начиная с версии 11g) есть способы использовать группы захвата - шестой аргумент для REGEX_SUBSTR. Смотрите, например https://stackoverflow.com/a/7759146/1967396, что приводит к

REGEXP_SUBSTR(col_name, '(\\[^\]+){2}\\$', 1, 1, NULL, 1) 

дать «содержимое первого захвата группы» - то есть «вещь в скобках в моем регулярном выражении» - т.е. \LOGIFLE в вашем примере (без задней \ хотя. .. так как это относится к «следующему матчу»).

2

соответствует второй к последней папке, используйте захват группы ...

SELECT REGEXP_SUBSTR(col_name, '(\\[^\]+\\)[^\]+\\$', 1, 1, NULL, 1) 

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

И REGEXP_SUBSTR(col_name, '\\[^]+\\$', 1, 2) не работает, потому что $ соответствует концу строки, поэтому не будет второго совпадения.

+0

По какой-то причине я начал думать о «$» как о значении «начать поиск моего шаблона в конце строки», а не «должен быть в конце строки», , Глупость моего запроса регулярного выражения должна была быть очевидной. Проблема решена. –

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