2014-02-20 54 views
1

我不明白如何從字符串末尾開始模式的第n個匹配。我讀過,但不能申請。Oracle正則表達式誤解

我正在使用的列是看通常喜歡的目錄路徑名:

I:\044\LOGFILE\aw_34\ 

我想拉出最後一個目錄名,並持續第二。使用REGEXP_SUBSTR我能夠得到使用

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

我想我要問這裏是最後的目錄:開始在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

無論出於何種原因,我開始考慮'$'作爲'在字符串末尾開始搜索我的模式',而不是'必須在字符串末尾' 。我的正則表達式請求的廢話應該是顯而易見的。問題解決了。 –