【问题标题】:Oracle Regexp - replace surrounding backets, but not inner stringOracle Regexp - 替换周围的备份,但不是内部字符串
【发布时间】: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>" 或 ">>>>" 之类的字符串或其他带有非匹配大括号?

标签: regex oracle plsql


【解决方案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
    

    【讨论】:

    • 理想情况下它只会抓取第一组,因此 '
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 2016-03-01
    • 2016-12-17
    相关资源
    最近更新 更多