Oracle Regexp - 替换周围的备份,但不是内部字符串

Posted

技术标签:

【中文标题】Oracle Regexp - 替换周围的备份,但不是内部字符串【英文标题】:Oracle Regexp - replace surrounding backets, but not inner string 【发布时间】:2014-07-28 15:22:13 【问题描述】:

我正在尝试使用以下字符串...

v VARCHAR2(100) := '<LABEL> FOR ABC';

然后把它变成……

'LABEL FOR ABC'

这似乎很容易,但我无法在一个正则表达式语句中完成。 <...> 块将始终启动字符串。

例如,我的最佳尝试....

v := REGEXP_SUBSTR(v, '[^\<][A-Z]+[^\>][A-Z ]+')

产生“标签”。

我确实设法通过执行以下操作来完成这项工作......

v := REGEXP_REPLACE(v, '^\<');
v := REGEXP_REPLACE(v, '\>', 1, 1);

但我想知道这是否可以在单个正则表达式语句中完成。

谢谢

编辑:我忘了提,我只想删除前导<...>。如果字符串类似于

<LABEL> FOR ABC <LEAVE ME>

我希望它是......

LABEL FOR ABC <LEAVE ME>

【问题讨论】:

只需将&lt;&gt; 替换为空字符串。你的正则表达式是[&gt;&lt;] 对于像 "LAB>" 或 ">>>>" 之类的字符串或其他带有非匹配大括号? 【参考方案1】:

您可以使用REGEXP_REPLACE('&lt;LABEL&gt; FOR ABC &lt;LEAVE ME&gt;','^&lt;(.*?)&gt;','\1')

图案:

^<    --matches '<' at the beginning of the string.
.*?   --non greedy quantifier to match 0 or more characters within '<' and '>'. 
      --This is enclosed in brackets to form first capture group.
      --This is then used in replace_string as \1.
>     --Matches the first '>' after the first '<'.

例子:

SELECT '<LABEL> FOR ABC <LEAVE ME>' str,
       REGEXP_REPLACE ('<LABEL> FOR ABC <LEAVE ME>', '^<(.*?)>', '\1') replaced_str
  FROM DUAL;

str                         replaced_str
----------------------------------------------------
<LABEL> FOR ABC <LEAVE ME>  LABEL FOR ABC <LEAVE ME>

【讨论】:

【参考方案2】:

您只想用空字符串替换&lt;&gt;的所有实例?那么这个:

SELECT
  REGEXP_REPLACE('<LABEL> blah', '[<>]', '') FROM DUAL

【讨论】:

理想情况下它只会抓取第一组,因此 '

以上是关于Oracle Regexp - 替换周围的备份,但不是内部字符串的主要内容,如果未能解决你的问题,请参考以下文章

Oracle REGEXP_REPLACE - 用子字符串替换多次出现的模式

Regexp_Replace 在 Oracle 中多次出现具有相同替换次数的字符

使用 oracle regexp_replace 替换代码的某些部分

oracle 使用 REGEXP_REPLACE 函数替换子字符

Oracle SQL REGEXP 用不同的列值替换特定字符串

如何使用Oracle中的SQL中的REGEXP_SUBSTR将自定义消息替换为空插槽