我对这个问题感到非常兴奋...... 我需要创建一个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,但却无法找到任何有用的东西。我花了很多时间看待前瞻和后面的分组,但无法找到一种方法让它发挥作用。
如果有人能想出一种方法来实现这一目标,无论是否光滑,我都会非常感激。我想象应该有一种更简单的方法来实现这一点,但我还是看不到它。任何想法???
答案 0 :(得分:0)
不要知道甲骨文,但我认为这样可行:
REVERSE
函数。((\n|.)*?(<reversedDate>)){3}
上使用以下正则表达式。显然,我正在为你制定相反的日期。或者(不确定这在Oracle中会是什么样子),只需复制三次。REVERSE
。