oracle 的 regexp_replace 替换 https 不起作用
Posted
技术标签:
【中文标题】oracle 的 regexp_replace 替换 https 不起作用【英文标题】:regexp_replace for oracle to replace https not working 【发布时间】:2018-08-03 20:22:02 【问题描述】:有人知道为什么 RegExp 可以在模拟器上工作,但不能真正在 oracle 上工作吗?
应该将 // 替换为 / 除了 https://
SELECT regexp_replace (url_link,'(?<!https:)\/\/','\/'), url_link
FROM URL_TABLE;
变化
https://pet/green//car/plane//garden
到
https://pate/gren/car/plane/gardn
谢谢
【问题讨论】:
因为Oracle only supports some of the syntax 其他平台和模拟器都会这样做。 正则表达式有不同的风格。 Oracle 的正则表达式引擎不支持前瞻。 “https”是真正的标记,还是两个斜杠前的冒号?http://my.website//my.page
的输出应该是什么?另外,您是否关心 https 是否位于字符串的开头,或者您是否还需要在字符串的更远处保护它?如果它是通用的(而不是专门针对https://
),那么连续三个(或更多)斜杠应该怎么做?特别是:file:/// .....
?
【参考方案1】:
对 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:\)\@<!
= 使用交替运算符对 "https:" 或 "http:" 进行否定回溯
\/\/
= 双正斜线模式
我们看到匹配的//
以蓝色突出显示
【讨论】:
【参考方案2】:不是很聪明,但工作(有点):
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]
【讨论】:
您可以将硬编码的8
替换为instr(url, '//')+1
以使其更智能(在找到第一个双斜杠后开始替换1 个字符:-)
当然,@Gary_W;我也确信在正则表达式方面经验丰富的人可能会做出某种magic 并向我们展示一些非常聪明的东西。
hmm.. 谢谢,我试过了,效果很好:) 很高兴记住这些技巧以上是关于oracle 的 regexp_replace 替换 https 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Oracle 中使用 REGEXP_REPLACE 删除单词
Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]
oracle 的 regexp_replace 替换 https 不起作用