我对正则表达式很糟糕而且懒得学习它(我知道,这很糟糕......)我的查询
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
答案 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#
(懒惰)