Oracle SQL REGEXP_REPLACE - 除指定字符串外的所有内容

Posted

技术标签:

【中文标题】Oracle SQL REGEXP_REPLACE - 除指定字符串外的所有内容【英文标题】:Oracle SQL REGEXP_REPLACE - Everything Except Specified String 【发布时间】:2021-05-26 04:09:57 【问题描述】:

我遇到了一些我认为很简单的问题,但我终其一生都无法解决。我正在尝试用空格替换所有 except 指定字符串。

我可以删除字符串(见下文),但无法“反转”操作。

with text as (
select 'Cat dog sheep /* 67 = 123 + monkey12 abcd and then a fish B1234.CAT_DOG_MOUSE and half a loaf of bread /* ON INNER JOIN B3456.BIRD_SHOE 11' as jibberish)
    
select regexp_replace(jibberish, '(B)[[:digit:]]4[.][[:alnum:]_]+', ' ') as new_text from text;

'Cat dog sheep /* 67 = 123 + monkey12 abcd and then a fish   and half a loaf of bread /* ON INNER JOIN   11'

我尝试过各种事情,例如 '[^(B)[[:digit:]]4[.][[:alnum:]_]+]*' 以及我尝试过的各种其他事情在这里找到,但它们似乎都不起作用。 这是在 Oracle 中使用正则表达式的一个怪癖吗?

澄清一下,在运行代码后,我想要一些看起来像这样的东西:

'              B1234.CAT_DOG_MOUSE                 B3456.BIRD_SHOE       '

任何帮助将不胜感激。

谢谢!

【问题讨论】:

那么,您替换匹配项并期望它们保留在输出中?这是不可能的。提取或匹配除您的模式匹配之外的所有内容。 在正则表达式中使用捕获组,在替换字符串中使用反向引用。查看示例here 首先,这不是一个有效的查询。 试试regexp_replace(jibberish, '(B\d4\.\w+)?.', '\1 ') @BarbarosÖzhan '来自双重' 【参考方案1】:

你可以使用

regexp_replace(jibberish, '(B\d4\.\w+)?.', '\1 ')

请参阅regex demo。

详情

(B\d4\.\w+)? - 一个可选组匹配 B,然后是四个数字、一个点,然后是一个或多个单词字符 . - 任何一个字符。

替换为\1,对捕获组捕获的值的反向引用。

如果可以有连续匹配,作为一种解决方法,请在预期匹配之后再添加一个 REGEXP_REPLACE 调用以附加一个空格:

regexp_replace(regexp_replace(jibberish, '(B\d4\.\w+)', '\1 '), '(B\d4\.\w+)?.', '\1 ')

不过,这可能会添加几个提取空格,但会找到所有连续的匹配项。

【讨论】:

在我的回答中(在您的回答前几分钟发布)我已经指出了一个“特殊情况”,当您的解决方案不会给出预期结果时:如果两个“保留”子字符串与没有分隔它们的字符。除此之外,您的解决方案与我的相同。 @mathguy 好的,我刚刚发布它是因为 OP 确认 my solution 有效。早在你发布答案之前它就已经存在了。 哦 - 好吧,我没注意到;我现在看到了。无论如何,我的解决方案是错误的——因为一个新的“保留”片段的开头将在第一个片段的结尾被消耗掉。如果此类片段可能背靠背出现,则需要不同的解决方案。 @mathguy 我认为这很明显:只需添加另一个regexp_replaceregexp_replace(regexp_replace(jibberish, '(B\d4\.\w+)', '\1 '), '(B\d4\.\w+)?.', '\1 ')。这可能会在字符串中添加一两个额外的空格,但会找到所有连续的匹配项。 实际上经过进一步思考,很明显我的“特殊情况”有两次连续出现,从一开始就是错误的。如果我们接受对 OP 尝试的严格解释,则不能出现两次背靠背事件;从第二个开始的 Bnnnn 部分必须被认为是第一次出现的结束,所以不能有紧随其后的“第二次出现”。 OP是否真的是那个意思,只有他自己知道。

以上是关于Oracle SQL REGEXP_REPLACE - 除指定字符串外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle sql 中使用 regexp_replace 标准化地址

Oracle SQL REGEXP_REPLACE - 除指定字符串外的所有内容

Oracle 正则表达式函数-REGEXP_REPLACE 使用例子

如何在 Oracle 中使用 REGEXP_REPLACE 删除单词

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]

将 Oracle Regexp_replace 函数转换为 Netezza