更改正则表达式中的子字符串定界符,不会返回相同的结果

时间:2019-03-19 15:45:13

标签: sql regex oracle regexp-substr

我对理解正则表达式有疑问。

我有以下字符串:

  

aaa'dd?'d'xxx'

在此字符串中

  

'

是子字符串定界符和

  

的转义字符
  

'

在Oracle SQL中,我有一句话根据子字符串分隔符将我的字符串分成子字符串:

select replace(

  regexp_substr(q'[aaa'dd?'d'xxx']', '(.*?[^?])(''|$)', 1, level, null, 1),

   '?''',

   '''') as result

FROM dual

connect by level <= regexp_count(q'[aaa'dd?'d'xxx']', '(.*?[^?])(''|$)');

在这种情况下,结果是:

  

aaa

     

dd      

xxx

...是正确的。

我的问题来自我想从

更改子字符串定界符的事实
  

'

进入

  

+

在这种情况下,主字符串变为

  

aaa + dd?+ d + xxx +

我在以下位置修改了SQL语句:

SELECT REPLACE(

  regexp_substr(q'[aaa+dd?+d+xxx+]', '(.*?[^?])(+|$)', 1, level, null, 1),

   '?''',

   '''') as result

FROM dual

connect by level <= regexp_count(q'[aaa+dd?+d+xxx+]', '(.*?[^?])(+|$)');

...,结果却不同:

  

a

     

a

     

a

     

+

     

d

     

d

     

?+

     

d

     

+

     

x

     

x

     

x

     

+

能否请我指出修改后的脚本在做什么,以获取相同的结果?

1 个答案:

答案 0 :(得分:2)

在正则表达式+中表示1个或多个前面的模式。尝试使用+转义\,使您的正则表达式'(.*?[^?])(\+|$)'