Oracle Regexp - 替换周围的支持,但不替换内部字符串

时间:2014-07-28 15:22:14

标签: regex oracle plsql

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

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

把它变成......

'LABEL FOR ABC'

这似乎很容易,但我无法在一个正则表达式语句中完成此操作。 &lt; ...&gt; block将始终启动字符串。

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

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

收益'标签'。

通过执行以下操作,我确实设法让这个工作......

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

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

由于

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

<LABEL> FOR ABC <LEAVE ME>

我希望它是......

LABEL FOR ABC <LEAVE ME>

2 个答案:

答案 0 :(得分:2)

您可以使用REGEXP_REPLACE('<LABEL> FOR ABC <LEAVE ME>','^<(.*?)>','\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>

答案 1 :(得分:1)

您只想用空字符串替换<>的所有实例?然后这个:

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