提取不同特殊符号之间的字符串

时间:2021-04-23 22:39:15

标签: sql regex oracle oracle11g

我的查询中有以下字符串

.\ABC\ABC\2021\02\24\ABC__123_123_123_ABC123.txt

从一个句点开始,我需要从中提取最终 \ 和文件扩展周期之间的段,这意味着遵循预期的结果

ABC__123_123_123_ABC123

我对使用 REGEXP 还很陌生,无法通过这里或其他地方的问答来帮助自己找到一个优雅(或可行)的解决方案。在所有查询中,模式在数量和顺序上都是相同的,但为了我的知识增长,我宁愿不只是计算和削减。

3 个答案:

答案 0 :(得分:1)

您可以使用 REGEXP_REPLACE(col,'(.*\\)(.*)\.(.*)','\2') 函数,例如

\\

为了提取从最后一个斜线开始到点的部分。 \.\ 中的前斜线用作转义字符,以区分特殊字符和我们预期的 .@extends('layouts. app') 字符。

Demo

答案 1 :(得分:1)

您只需要 regexp_substr 和简单的正则表达式 ([^\]+)\.[^.]*$

select
 regexp_substr(
   '.\ABC\ABC\2021\02\24\ABC__123_123_123_ABC123.txt',
   '([^\]+)\.[^.]*$',
   1, -- position
   1, -- occurence
   null, -- match_parameter 
   1  -- subexpr 
) substring 
from dual;

([^\]+)\.[^.]*$ 表示:

  • ([^\]+) - 找到一个或多个(+) 除斜杠([] - set, ^ -negative, ie except) 之外的任何字符并将其命名为组\ 1(子表达式#1)
  • \. - 然后是简单的点(. 是一个特殊字符,表示任何字符,所以我们需要使用 \ 来“转义”它,这是一个转义字符)
  • [^.]* - 除 . 之外的零个或多个任何字符
  • $ - 行尾

所以这个正则表达式的意思是:找到一个子字符串,它包含:一个或多个除斜杠外的任何字符,后跟点,后跟零个或多个除点外的任何字符,它应该在字符串的末尾。而subexpr参数=1,表示oracle返回第一个子表达式(即(...)中的第一个匹配组)

您可以在 doc 中找到的其他参数。

答案 2 :(得分:0)

这是我与 Oracle 11g R2PCRE2 和其他一些语言的完全兼容的简单示例。

Oracle 11g R2 使用函数 substr (Reference documentation)

 select
 regexp_substr(
   '.\ABC\ABC\2021\02\24\ABC__123_123_123_ABC123.txt',
   '((\w)+(_){2}(((\d){3}(_)){3}){1}((\w)+(\d)+){1}){1}',
   1, 
   1
 ) substring 
from dual;

模式:((\w)+(_){2}(((\d){3}(_)){3}){1}((\w)+(\d)+){1}){1}

结果:ABC__123_123_123_ABC123

尽可能简单,正则表达式始终遵循最低标准,正如您所看到的,还提供了可移植性,以防其他人有兴趣采用最简单的方式。

希望这能帮到你!

相关问题