在两个文本分隔符(标记)之间提取文本

时间:2015-01-29 16:23:58

标签: sql regex oracle

我对正则表达式很糟糕而且懒得学习它(我知道,这很糟糕......)我的查询

SELECT regexp_replace('MYSTART1#blah~MYSTART2#blah2~MYSTART3#blah-blah~MYSTART4#blah-blah', '.*MYSTART2#(.+)\~.*', '\1') FROM DUAL;

应显示MYSTART2#~

之间的值

结果: blah2~MYSTART3#blah-blahMYSTART4#blah-blah

需要blah2

3 个答案:

答案 0 :(得分:1)

加号运算符是“贪婪的”,这意味着它匹配尽可能多的字符。添加一个问号,使其变得懒惰:

'.*MYSTART2#(.+?)\~.*'

答案 1 :(得分:0)

使用regexp_substr:

SELECT regexp_substr('MYSTART1#blah~MYSTART2#blah2~MYSTART3#blah-blah~MYSTART4#blah-blah', '[^\#\~]+', 1, 2*&mystart_pos) FROM DUAL;

答案 2 :(得分:0)

这是因为你使用了贪婪的基数。你应该使用非贪婪的(或懒惰的):(.+?)

例如输入aaa#bbb#ccc#ddd

  • #.*#将匹配#bbb#ccc#(贪婪)
  • #.*?#将匹配#bbb#(懒惰)