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:\)\@&lt;! = 使用交替运算符对 "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 不起作用

试图了解oracle REGEXP_REPLACE如何工作

如何在 edb 中使用相同的 REGEXP_REPLACE(Oracle sql)

关于 Oracle Regexp_Replace