Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Regexp\u Substr问题_Sql_Regex_Oracle - Fatal编程技术网

Sql Regexp\u Substr问题

Sql Regexp\u Substr问题,sql,regex,oracle,Sql,Regex,Oracle,我必须解析一个notes字段,其中包含一些非常糟糕的字符,我需要从一些内部术语中提取一个日期 基本上字段是这样的,这是4个不同的注释,我只想从中提取日期: Ltr Cert Expires ****01/15/17*** Ltr Cert Expires ***01/5/2010*** Ltr Cert Expires **01/10/11*** Ltr Cert Expires *******01/15/01*** 我对regexp_substr不是非常熟悉,但我在这里翻了一下,没有

我必须解析一个notes字段,其中包含一些非常糟糕的字符,我需要从一些内部术语中提取一个日期

基本上字段是这样的,这是4个不同的注释,我只想从中提取日期:

Ltr Cert Expires  ****01/15/17***
Ltr Cert Expires  ***01/5/2010***
Ltr Cert Expires  **01/10/11***
Ltr Cert Expires  *******01/15/01***
我对regexp_substr不是非常熟悉,但我在这里翻了一下,没有看到很多符合我所寻找的示例


有什么想法吗?也许有人建议阅读Oracle的Regexp?我对这项功能非常陌生,代码有时有点让人困惑。

这可能是一种非常不言自明的方式

它查找一个由一个或两个数字组成的序列(
[0-9]{1,2}
),后跟一个“/”(
\/
)等等

可以用许多不同、更紧凑或更尖锐的方式重新编写,例如,检查内容是否确实表示日期,但如果您假设每一行(与示例数据一样)始终以示例数据的一种格式包含恰好一个日期,这就足够了:

with test(t) as (
    select 'Ltr Cert Expires  ****01/15/17***' from dual union all
    select 'Ltr Cert Expires  ***01/5/2010***' from dual union all
    select 'Ltr Cert Expires  **01/10/11***' from dual union all
    select 'Ltr Cert Expires  *******01/15/01***' from dual
)
select regexp_substr(t, '[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2,4}')
from test
给出:

01/15/17
01/5/2010
01/10/11
01/15/01
仅举一个不同方法的例子,以下数据给出了相同的结果:

regexp_substr(t, '([^\*]+)', 1, 2)
这将搜索至少一个与
'*'
不同的字符序列,但返回第二个匹配项(第四个参数的值为
2
)。第一次出现在第一个
'*'
之前,因此第二次出现在
'*'
的第一个和第二个序列之间的字符串部分

在本例中,这将返回您拥有的任何字符串,无论它是否是日期

这个

给出:

STR1       STR2
---------- ------------------------------
01/15/17   01/15/17
01/5/2010  01/5/2010
01/10/11   01/10/11
01/15/01   01/15/01
           Not a date, but ...

非常感谢-我一直在试图找出如何按字符搜索,也许是找到星星后面的东西,但我并没有真正考虑只搜索数字并匹配1和2个匹配项。@JordanHaymond:只是展示了一种不同的方式,只是为了解释
STR1       STR2
---------- ------------------------------
01/15/17   01/15/17
01/5/2010  01/5/2010
01/10/11   01/10/11
01/15/01   01/15/01
           Not a date, but ...