REGEXP_SUBSTR:提取[]包括[]之间的字符串部分

时间:2013-08-01 20:38:47

标签: sql regex oracle oracle11g

我使用的是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]

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

谢谢&问候, Bishal

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我不是Oracle用户,但是通过快速阅读docs,我认为这应该是关闭的:

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

这看起来比它更糟糕。

模式是:

  • ^[^\[]*捕获所有字符,但不包括第一个[
  • (\[[^\]]*\])[<not "]">]
  • 之类的内容捕获到第1组
  • [^\[]*捕捉所有内容(坚果不包括)下一个[
  • (\[[^\]]*\])在字符串末尾捕获[<not "]">]之类的任何内容

然后更换很简单,只需<grp 1> <grp 2>