我的查询中有以下字符串
.\ABC\ABC\2021\02\24\ABC__123_123_123_ABC123.txt
从一个句点开始,我需要从中提取最终 \ 和文件扩展周期之间的段,这意味着遵循预期的结果
ABC__123_123_123_ABC123
我对使用 REGEXP 还很陌生,无法通过这里或其他地方的问答来帮助自己找到一个优雅(或可行)的解决方案。在所有查询中,模式在数量和顺序上都是相同的,但为了我的知识增长,我宁愿不只是计算和削减。
答案 0 :(得分:1)
您可以使用 REGEXP_REPLACE(col,'(.*\\)(.*)\.(.*)','\2')
函数,例如
\\
为了提取从最后一个斜线开始到点的部分。 \.
和 \
中的前斜线用作转义字符,以区分特殊字符和我们预期的 .
和 @extends('layouts. app')
字符。
答案 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 R2、PCRE2 和其他一些语言的完全兼容的简单示例。
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
尽可能简单,正则表达式始终遵循最低标准,正如您所看到的,还提供了可移植性,以防其他人有兴趣采用最简单的方式。
希望这能帮到你!