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