任何人都知道为什么RegExp可以在模拟器上运行,但在oracle中却没有?
应该用https://
替换// with / exceptSELECT regexp_replace (url_link,'(?<!https:)\/\/','\/'), url_link
FROM URL_TABLE;
更改
https://pet/green//car/plane//garden
到
https://pate/gren/car/plane/gardn
谢谢
答案 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;使用交替运算符
\/\/
=双向前削减模式
我们看到匹配的//
以蓝色突出显示
答案 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]