Subexpression在正则表达式Oracle中

时间:2015-10-16 21:10:46

标签: sql regex oracle oracle11g

为什么我们需要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)模式)。有没有人有现实世界的例子?

2 个答案:

答案 0 :(得分: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中使用时将返回整个字符串。 如果使用子表达式,则只能提取日期部分。对于上面的例子,它将是第三个子表达式。

答案 1 :(得分: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