SQL中的正则表达式 - 需要提取多行字符串的最后三个部分

时间:2014-09-05 01:43:41

标签: sql regex oracle

我对这个问题感到非常兴奋...... 我需要创建一个SQL查询,它返回一个自定义字段,该字段由多行字符串(CLOB字段)的最后三个部分组成。数据库是Oracle。我选择使用REGEXP_SUBSTR函数来尝试使其工作。即使使用C#或Java很容易解析,我也只能使用SQL,所以我无法使用代码来执行此操作。

以下是原始字段中数据的示例:

2000-01-01: Description section containing any valid text characters, including
    other dates(not followed by a colon), and potentially other hyphenated
    characters.  Potentially has multiple newline characters.
-
2001-01-01: 2nd section with different content, but following same parameters
    as first section.
-
2002-01-01: 3rd section with different content, but following same parameters
    as first section.
-
2003-01-01: 4th section with different content, but following same parameters
    as first section.
-
2004-05-05: 5th section with different content, but following same parameters
    as first section.

所以,根据以上数据,我想得到最后三个部分,如下所示:

2002-01-01: 3rd section with different content, but following same parameters
    as first section.
-
2003-01-01: 4th section with different content, but following same parameters
    as first section.
-
2004-05-05: 5th section with different content, but following same parameters
    as first section.

我尝试了很多RegEx表达式,并且能够匹配字符串中的前几个部分,但是找不到将其限制在最后三个部分的方法,而不会无意中匹配整个字符串。

这是我最近的尝试:

SELECT REGEXP_SUBSTR(CLOB_FIELD_1, '(<date>.*?-\s+){0,2}(<date>.*?$)', 1, 1, 'n')
FROM MY_TABLE

为了便于阅读,我将日期匹配正则表达式部分替换为<date>。 无论您在哪里看到<date>

,实际的正则表达式都会包含以下内容
(19|2\d)?\d\d([-/.])(0?[1-9]|1[012])\2(0?[1-9]|[12]\d|3[01]):

基本上,这是一种非常严格的方式来匹配日期模式YYYY-MM-DD:YYYY/MM/DD:YYYY.MM.DD:

使用此表达式返回整个字符串,因为最后是.*?$。 我很确定?是不必要的,但那是我试图让它变得非贪婪。

我一直都在我最喜欢的RegEx Reference Site,但却无法找到任何有用的东西。我花了很多时间看待前瞻和后面的分组,但无法找到一种方法让它发挥作用。

如果有人能想出一种方法来实现这一目标,无论是否光滑,我都会非常感激。我想象应该有一种更简单的方法来实现这一点,但我还是看不到它。任何想法???

1 个答案:

答案 0 :(得分:0)

不要知道甲骨文,但我认为这样可行:

  1. 首先,在整个字符串上使用REVERSE函数。
  2. 在反向字符串((\n|.)*?(<reversedDate>)){3}上使用以下正则表达式。显然,我正在为你制定相反的日期。或者(不确定这在Oracle中会是什么样子),只需复制三次。
  3. 再次使用REVERSE