【问题标题】:Oracle SQL REGEXP_REPLACE - Everything Except Specified StringOracle SQL REGEXP_REPLACE - 除指定字符串外的所有内容
【发布时间】: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\d{4}\.\w+)?.', '\1 ')
  • @BarbarosÖzhan '来自双重'

标签: sql regex oracle regexp-replace


【解决方案1】:

你可以使用

regexp_replace(jibberish, '(B\d{4}\.\w+)?.', '\1 ')

请参阅regex demo。

详情

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

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

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

regexp_replace(regexp_replace(jibberish, '(B\d{4}\.\w+)', '\1 '), '(B\d{4}\.\w+)?.', '\1 ')

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

【讨论】:

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