REGEXP子串Oracle

时间:2014-07-22 01:29:30

标签: regex oracle

我正在寻找正则表达式,以便从下面的字符串中获取正确的文件名。

输入

Report_18072014.pdf

预期产出

Report.pdf

到目前为止的查询给出了正确的输出。

REPLACE(FILENAME, '_' || TRIM(REGEXP_SUBSTR (FILENAME, '[^_.]+',1,2))) 

我的问题是,如果有一个更好的正则表达式,我可以使用它来避免将_连接到replace函数中的子字符串。

2 个答案:

答案 0 :(得分:2)

使用您的文件格式,您可以使用以下内容:

REGEXP_REPLACE(FILENAME, '^([[:alnum:]]+)_[^.]+(\.[^.]+)',
                         '\1\2',
                         1, 0, 'c')

<强>解释

  • ^锚点断言我们位于字符串的开头
  • ([[:alnum:]]+)会抓住第1组的信件。
  • [^.]+匹配任何非.
  • 的字符
  • (\.[^.]+)捕获第2组的扩展名(点和任何不是点的字符)
  • \1\2取代第1组,第2组

答案 1 :(得分:1)

尝试使用[未经测试]:

REGEXP_REPLACE(FILENAME, '_[[:digit:]]*\.', '.')

我非常喜欢使用正则表达式,但我希望Oracle使用PCRE格式而不是POSIX格式。

说明:

  • _ [[:digit:]] *匹配下划线和0位或更多位数。
  • 。匹配期间以确保您位于文件扩展名旁边
  • 决赛,&#39;。&#39;用句点替换所有内容,以便您仍然拥有.PDF

我会将替换更改为&#39; .PDF&#39;但我不想强制将您的文件名用于混合案例文件。