提取两个文本分隔符(标签)之间的文本



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

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

加号运算符是"贪婪",这意味着它匹配尽可能多的字符。添加一个问号以使其惰性:

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

使用regexp_substr:

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

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

例如,输入aaa#bbb#ccc#ddd

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

最新更新