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>
【问题讨论】:
只需将<
或>
替换为空字符串。你的正则表达式是[><]
对于像 "LAB>您可以使用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>
【讨论】:
【参考方案2】:您只想用空字符串替换<
和>
的所有实例?那么这个:
SELECT
REGEXP_REPLACE('<LABEL> blah', '[<>]', '') FROM DUAL
【讨论】:
理想情况下它只会抓取第一组,因此 '以上是关于Oracle Regexp - 替换周围的备份,但不是内部字符串的主要内容,如果未能解决你的问题,请参考以下文章
Oracle REGEXP_REPLACE - 用子字符串替换多次出现的模式
Regexp_Replace 在 Oracle 中多次出现具有相同替换次数的字符
使用 oracle regexp_replace 替换代码的某些部分
oracle 使用 REGEXP_REPLACE 函数替换子字符