簡體   English   中英

正則表達式Oracle中的子表達式

[英]Subexpression in regular expression Oracle

為什么在Oracle中需要在正則表達式中有一個子表達式?

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

這是docs中的示例:

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

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

但是我不清楚,為什么我們真的需要此參數(在上面的示例中,我們只能使用4(56)(78)模式)。 有人有真實的例子嗎?

Oracle regex不支持環視 就像^$錨可以用來指定字符串的開始和結束一樣,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中使用時將返回整個字符串。 如果使用子表達式,則只能提取日期部分。 對於上面的示例,它將是第三個子表達式。

好吧,我知道了,所以如果對此感興趣的人就是我的答案:

當我們想找到一個特定的字符串時,可以使用子表達式,它可以跟隨某個字符串,也可以跟隨某個字符串,等等(或者,找到一個字符串,之后跟隨一些字符串)

因此,對於上例,我修改了源字符串:

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

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

在這里,只有在字符串45678跟隨123我們才能找到它的位置。 我們得到9而不是1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM