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_replace
:regexp_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 删除单词