我正在尝试使用&
替换字符串中的所有&
,除非&
后跟lt
,apos
,{ {1}}或gt
。
运行此声明
quot
然而,导致字符串没有变化。
我想要的输出是
select
regexp_replace('< &apos > " &','&(^lt|^gt|^quot|^apos)','&')
答案 0 :(得分:0)
这些代码看起来很像HTML实体名称,但缺少结束的分号......使得名称结束时不太清楚。
在下面的解决方案中,我假设这些实体不能立即跟上字母,数字或下划线。
当&
跟随此类字符时,它被视为实体,而不是被触摸。只替换了其他&
。
select regexp_replace('< &apos > " &', '&(\W|$)', '&\1') from dual;
\W|$
与字母,数字或下划线或字符串末尾的字符匹配。
答案 1 :(得分:0)
直接有效的解决方案(但难以编写,阅读和维护)是:
set define off
(如果您使用的是使用&
标记替换变量的前端)
然后
with
inputs ( inp_str ) as (
select '< &apos > " &' from dual union all
select 'Hello, World!' from dual union all
select '' from dual union all
select '7 < 10 &and &"' 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]))))',
'&\1') as new_str
from inputs;
解释 :(部分...)这将取代每个&amp;有&amp; amp,有一些例外。 &amp;将在以下情况下被替换:
输出(来自我的输入):
INP_STR NEW_STR
---------------------------- ----------------------------
< &apos > " & < &apos > " &
Hello, World! Hello, World!
7 < 10 &and &" 7 < 10 &and &"
4 rows selected.
(注意:我总是在输入中包含一个空字符串和一个没有&符号的字符串,以验证查询在它们上是否也能正常工作。)