1

我在 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]

请让我知道如何获得所需的输出。

谢谢和问候, 比沙尔

4

2 回答 2

2

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

select
 regexp_replace('select userid,username from tablename where user_id=[REQ.UID] and username=[REQD.VP.UNAME]'
,'.*(\[.*?\]).*(\[.*?\]).*','\1\2')
from dual
;
于 2013-08-01T23:41:50.550 回答
1

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

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

这看起来比它更糟糕。

模式是:

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

那么替换很简单,只需<grp 1> <grp 2>

于 2013-08-01T21:50:59.303 回答