【问题标题】: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

标签: sql regex oracle oracle11g


【解决方案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 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

    正则表达式尽可能简单,始终遵循最低标准,正如您所见,它还提供了可移植性,仅适用于其他人有兴趣采用最简单方法的情况。

    希望对您有所帮助!

    【讨论】:

    • 这与我尝试过的类似,但在数据库上不起作用,尽管语法也是正确的。
    • Oracle 不支持 PCRE,你不需要在 [] 中转义 _-
    • @SayanMalakshinov 是的,我知道,我会针对这种情况进行更改
    • @TobiasB,我更新了我的答案,提供了可移植性。
    • 哦,谢谢!哈哈,我知道我会在学习如何正确使用这个好功能时既沮丧又有趣:)
    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多