用于oracle的regexp_replace替换https无法正常工作

时间:2018-02-23 17:50:29

标签: oracle regexp-replace

任何人都知道为什么RegExp可以在模拟器上运行,但在oracle中却没有?

应该用https://

替换// with / except
SELECT regexp_replace (url_link,'(?<!https:)\/\/','\/'), url_link
FROM URL_TABLE;

更改

https://pet/green//car/plane//garden

https://pate/gren/car/plane/gardn

谢谢

2 个答案:

答案 0 :(得分:6)

在REGEXPR_REPLACE模式字符串中使用//之前的字符使用非冒号字符列表

这与Littlefoot的解决方案相同,只是为了确保我们不会将第一个//替换为前面的:

我们只是表明我们不希望与非冒号字符列表[^:]匹配,然后将其封装在一个字符组中(将其置于一个画面中)。

在我们的替换字符串中,我们只引用这个字符组\1转换为第一个字符组。

SCOTT@db>SELECT
  2      regexp_replace('https://pet/green//car/plane//garden','([^:])//','\1/')  http_url
  3  FROM
  4      dual;

http_url                                 
------------------------------------
https://pet/green/car/plane/garden

<强>附录

作为这种模式匹配问题的旁注,如果Oracle正则表达式的实现确实具有(负面)前瞻或(负面)后观,那肯定会很好。

这是Vim正则表达式匹配的一个例子:

\(https:\|http:\)\@<! =&#34; https:&#34;或&#34; http:&#34;使用交替运算符

\/\/ =双向前削减模式

我们看到匹配的//以蓝色突出显示

enter image description here

答案 1 :(得分:4)

不是很聪明,但有效(有点):

SQL> with test as (select 'https://pet/green//car/plane//garden' url from dual)
  2  --
  3  select
  4    regexp_replace(url, '//', '/', 8) res1,
  5    regexp_replace(url, '//', '/', instr(url, '//') + 1) res2
  6  from test;

RES1                               RES2
---------------------------------- ----------------------------------
https://pet/green/car/plane/garden https://pet/green/car/plane/garden

SQL>

[加上Gary_W的建议为RES2]