繁体   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