2015-10-16 64 views
0

爲什麼我們需要Oracle中正則表達式中的子表達式?正則表達式中的子表達式Oracle

這是Oracle 11g的新功能,我們可以指定我們想要查找的模式中的哪個子表達式。我們可以在REGEXP_SUBSTRREGEXP_INSTR中使用此參數。

下面是從文檔的例子:

SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 2) 
"REGEXP_INSTR" FROM DUAL; 

REGEXP_INSTR 
------------------- 
4 

但它不是我清楚,爲什麼我們真的需要這個參數(在上面的例子中,我們可以只使用4(56)(78)模式)。有沒有人有現實世界的例子?

+0

我認爲這是獲得該正則表達式模式的特定組。當這個概念被稱爲組時,我不知道爲什麼它被稱爲子表達式。因此,對於這種模式(123)(4(56)(78)),有4組1 = 123,2 = 4,3 = 56和4 = 78每組圓括號決定一個組。我沒有添加它作爲答案,因爲我不記得一個使用的例子,但它是必要的! –

+0

@JorgeCamposyes,是的,這是團體。但在文檔中,他們稱之爲「子表達式」。不知道爲什麼。我幾乎明白爲什麼我們需要它。也許有人可以提供很好的現實世界的例子... – Tatiana

+0

閱讀本教程:http://www.regular-expressions.info/tutorial.html在regepx中分組和捕獲組是非常巨大的話題。 Oracle正則表達式的實現是有限的,例如,您不能在模式本身中使用後退前向引用,但可以在REGEXP_REPLACE中使用。 – krokodilko

回答

2

Oracle正則表達式不支持lookaround。就像^$錨點可以用來指定字符串的開始和結束,可以使用lookarounds(lookbehind/lookahead)來匹配(或不匹配)您感興趣的模式之前或之後的任何模式。

例如,考慮列中的以下值,並且只需要選擇取件日期。

event_dte 
---------------------- 
pickup_dte 2015-04-03 
shipped_dte 2015-03-02 
PU_dte 2015-03-11 
pickup_date 2014-05-02 
delivery_dte 2015-07-11 

這裏有所有可能的日期和取件日期的措辭也不一致。

你可以寫一個像(pickup|PU)_d(a?)te (\d{4}-]d{2}-\d{2})的正則表達式。這將匹配整個字符串,並且在regexp_substr中使用時將返回整個字符串。 如果使用子表達式,則只能提取日期部分。對於上面的例子,它將是第三個子表達式。

0

好吧,我想通了這一點,所以如果有人感興趣,這是我的回答:

我們使用的子表達式,當我們想要找到一個特定的字符串,它遵循一些字符串,這也可能如下一些字符串等。 (或以其他方式,找到一個字符串,其次是一些字符串)

因此,對於上方的例子我修改源字符串:

SELECT REGEXP_INSTR('456781234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 2) 
"REGEXP_INSTR" FROM DUAL; 

REGEXP_INSTR 
------------------- 
9 

在這裏我們會發現串45678的位置,只有當它遵循123。我們得到9而不是1