【问题标题】:REGEXP_SUBSTR : extracting portion of string between [ ] including []REGEXP_SUBSTR :提取 [ ] 之间的字符串部分,包括 []
【发布时间】:2013-08-01 20:38:47
【问题描述】:

我使用的是 Oracle 11gR2。

我正在尝试提取 '[' 和 ']' 之间的文本,包括 []。

例如:

    select regexp_substr('select userid,username from tablename where user_id=[REQ.UID] and username=[REQD.VP.UNAME]','\[(.*)\]') from dual

输出:

    [REQ.UID] and username=[REQD.VP.UNAME]

需要输出:

    [REQ.UID][REQD.VP.UNAME]

请告诉我如何获得所需的输出。

感谢和问候, 比沙尔

【问题讨论】:

    标签: sql regex oracle oracle11g


    【解决方案1】:

    假设您只会出现两次 [],那么以下内容就足够了。这 ?在里面 。*?意味着它是非贪婪的,因此它不会吞噬最后一个]。

    select
     regexp_replace('select userid,username from tablename where user_id=[REQ.UID] and username=[REQD.VP.UNAME]'
    ,'.*(\[.*?\]).*(\[.*?\]).*','\1\2')
    from dual
    ;
    

    【讨论】:

    • 另一个小疑问:如何在同一个示例中处理多行?
    • 对于多行,您需要使用 regexp_replacematch_parameter 来接受换行符作为任何字符。所以,regexp_replace('select userid,username from tablename where user_id=[REQ.UID] and username=[REQD.VP.UNAME]','.*(\[.*?\]).*(\[.*?\]).*','\1\2',1,0,'n') - 有关详细信息,请参阅 REGEXP_REPLACE
    【解决方案2】:

    我不是 Oracle 用户,但通过快速阅读docs,我认为这应该很接近:

    REGEXP_REPLACE('select userid,username from tablename where user_id=[REQ.UID] and username=[REQD.VP.UNAME]',
                   '^[^\[]*(\[[^\]]*\])[^\[]*(\[[^\]]*\])$', '\1 \2')
    

    这看起来比实际更糟糕。

    模式是:

    • ^[^\[]* 捕获直到(但不包括)第一个 [ 的所有字符
    • (\[[^\]]*\]) 捕获到第 1 组中的任何内容,例如 [<not "]">]
    • [^\[]* 捕获直到(不包括)下一个 [ 的所有内容
    • (\[[^\]]*\]) 捕获到第 2 组中的任何内容,例如 [<not "]">],位于字符串的末尾

    那么替换就简单了,<grp 1> <grp 2>

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 2020-04-19
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2019-07-02
      • 1970-01-01
      相关资源
      最近更新 更多