Oracle替换后跟另一个字符的字符

时间:2016-08-31 19:24:29

标签: sql regex oracle

我正在尝试使用&替换字符串中的所有&amp,除非&后跟ltapos,{ {1}}或gt

运行此声明

quot
然而,

导致字符串没有变化。

我想要的输出是

select 
    regexp_replace('&lt &apos &gt &quot &','&(^lt|^gt|^quot|^apos)','&amp')

2 个答案:

答案 0 :(得分:0)

这些代码看起来很像HTML实体名称,但缺少结束的分号......使得名称结束时不太清楚。

在下面的解决方案中,我假设这些实体不能立即跟上​​字母,数字或下划线。

&跟随此类字符时,它被视为实体,而不是被触摸。只替换了其他&

select regexp_replace('&lt &apos &gt &quot &', '&(\W|$)', '&amp\1') from dual;

\W|$与字母,数字或下划线或字符串末尾的字符匹配。

答案 1 :(得分:0)

直接有效的解决方案(但难以编写,阅读和维护)是:

set define off

(如果您使用的是使用&标记替换变量的前端)

然后

with
     inputs ( inp_str ) as (
       select '&lt &apos &gt &quot &' from dual union all
       select 'Hello, World!'         from dual union all
       select ''                      from dual union all
       select '7 &lt 10 &and &&quot'  from dual
     )
select inp_str,
       regexp_replace(inp_str, 
  '&($|[^lagq]|(g|l)([^t]|$)|a($|[^p]|p($|[^o]|o($|[^s])))|q($|[^u]|u($|[^o]|o($|[^t]))))',
         '&amp\1') as new_str
from inputs;

解释 :(部分...)这将取代每个&有& amp,有一些例外。 &将在以下情况下被替换:

  • 后面是字符串($)或
  • 的结尾
  • 接下来是l,a,g或q以外的任何字符;或
  • 后跟g或l,然后是t以外的字符,或者字符串结尾($);或
  • 接下来是a,后跟字符串的结尾,除了p以外的任何字母,或字母p后跟字符串的结尾,或.........

输出(来自我的输入):

INP_STR                      NEW_STR
---------------------------- ----------------------------
&lt &apos &gt &quot &        &lt &apos &gt &quot &amp
Hello, World!                Hello, World!

7 &lt 10 &and &&quot         7 &lt 10 &ampand &amp&quot

4 rows selected.

(注意:我总是在输入中包含一个空字符串和一个没有&符号的字符串,以验证查询在它们上是否也能正常工作。)