PL / SQL模式匹配

时间:2017-03-17 13:06:36

标签: oracle plsql oracle11g

我有一个字符串,例如'星期天对我来说是美好的一天                      $ 20170912'

我希望输出为'周日很棒$ 20170912',即应该保留的日期

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

在上面的帖子中查看我的评论。也就是说,这里的解决方案仅适用于您使用regexp_replace()提供的确切示例。也许它会给你一些想法。

SQL> with tbl(str) as (
      select 'Sunday was great $day for me $20170912' from dual
    )
    select 
      regexp_replace(str, '^(.*)( \$.*)( \$20\d{2}[01]\d[0-3]\d)$', '\1\3' ) After
    from tbl;

AFTER
--------------------------
Sunday was great $20170912

SQL>

请注意,我测试最后8位数的正则表达式也不是很强大,需要改进。它只检查21世纪的一年等等。这只是一个弱小的例子,我怀疑这里的正则表达式大师之一会有更好的日期验证正则表达式。如果您只关心检查8个号码,可以使用( \$\d{8})作为第三组。

无论如何,正则表达式将字符串拆分为3个由括号括起来的字符组。第一组是第一个美元符号之前的行的开头,但不包括空格。第二组包含第一个美元符号前面的空格和最后但不包括最后一个美元符号前面的空格的字符。第三组是以最后一个美元符号前面的空格开头的字符集,后跟文字'20'和2位数(年),0或1后跟数字(月),0到3跟随按一个数字(天),然后是字符串的结尾。返回的是由'\ 1 \ 3'引用的第一个和最后一个连接的组。

警告:请注意,如果您将09的月份更改为99,则匹配将失败,如果未找到匹配项,则会返回原始字符串,因此您必须了解此操作。