提取不同特殊符号之间的字符串
Posted
技术标签:
【中文标题】提取不同特殊符号之间的字符串【英文标题】:Extract string between different special symbols 【发布时间】:2021-07-18 02:41:57 【问题描述】:我的查询中有以下字符串
.\ABC\ABC\2021\02\24\ABC__123_123_123_ABC123.txt
从一个时期开始,我需要从中提取最终 \ 和文件扩展名之间的段,这意味着遵循预期结果
ABC__123_123_123_ABC123
我对使用 REGEXP 相当陌生,无法帮助自己找到一个优雅(或可行)的解决方案,在这里或其他地方进行问答。在所有查询中,模式在数量和顺序上都是相同的,但为了我的知识增长,我更愿意不只是计数和切割。
【问题讨论】:
我明白了,我会给你贴一个正则表达式的例子,也许它也适用于 SQL。 【参考方案1】:可以使用REGEXP_REPLACE
等函数
REGEXP_REPLACE(col,'(.*\\)(.*)\.(.*)','\2')
为了提取从最后一个斜线到点的片段。 \\
和 \.
中前面的斜杠用作转义字符,以区分特殊字符和我们预期的 \
和 .
字符。
Demo
【讨论】:
【参考方案2】:您只需要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;
([^\]+)\.[^.]*$
表示:
([^\]+)
- 找到一个或多个(+
)除斜杠之外的任何字符([]
- 设置,^
- 否定,即除)并将其命名为组 \1(子表达式 #1)
\.
- 然后是简单的点(.
是一个特殊字符,表示任何字符,所以我们需要使用 \
这是一个转义字符来“转义”它)
[^.]*
- 除.
之外的零个或多个任意字符
$
- 行尾
所以这个正则表达式的意思是:找到一个子字符串,它包含:一个或多个除斜杠外的任何字符,后跟点,后跟零个或多个除点之外的任何字符,它应该在字符串的末尾。而subexpr
参数=1,表示oracle返回第一个子表达式(即(...)
中的第一个匹配组)
其他参数可以在doc中找到。
【讨论】:
感谢您的解释 - 将在下周进一步教育自己。这对我来说真的很有帮助......在备忘单等方面并没有走得太远,但作为一个工作示例,我可以涉足并学习现在 Barbaros 的公式已被 DB 接受并根据需要工作。【参考方案3】:这是我与 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
正则表达式尽可能简单,始终遵循最低标准,正如您所见,它还提供了可移植性,仅适用于其他人有兴趣采用最简单方法的情况。
希望对您有所帮助!
【讨论】:
这与我尝试过的类似,但在数据库上不起作用,尽管语法也是正确的。 Oracle 不支持 PCRE,你不需要在 [] 中转义_-
@SayanMalakshinov 是的,我知道,我会针对这种情况进行更改
@TobiasB,我更新了我的答案,提供了可移植性。
哦,谢谢!哈哈,我知道我会在学习如何正确使用这个好功能时既沮丧又有趣:)以上是关于提取不同特殊符号之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章
关于正则表达式的特殊符号的处理之前自己在提取一个表达式一直提取不到,后来解决了,记录下知识点