【问题标题】:Regex: regex match everything but specific pattern正则表达式:正则表达式匹配除特定模式之外的所有内容
【发布时间】:2020-06-25 05:16:53
【问题描述】:

我需要一个在字符串中查找除!#! 之外的值的正则表达式。

例如,如果字符串是:

Text1!#!Text2!#!Text#3!#!

它应该返回Text1Text2Text#3

[^!#!] 也会匹配 Text#3 中的 #,这是我不想要的。

【问题讨论】:

  • 这能回答你的问题吗? Regex: match everything but specific pattern
  • @Prakash S - 使用哪种正则表达式?
  • ** 会变成什么?例如,如果在!#! 上拆分字符串,则会得到一个包含Text1**Text2Text#3** 的数组。
  • @CarySwoveland 我怀疑** 的目的是作为粗体文本的标记,即它们不是实际数据的一部分。
  • 运行正则表达式的语言是什么?为什么要使用正则表达式而不是简单地将字符串拆分为固定模式!#!,然后遍历结果数组中的每个元素?

标签: regex oracle regex-negation


【解决方案1】:

您可以将REGEXP_SUBSTRCONNECT_BY 结合使用,将字符串拆分为由!#! 分隔的单词。我们使用正则表达式:

(.*?)(!#!|$)

它会延迟匹配一些字符,直到遇到 !#! 或字符串结尾 ($)。

例如:

SELECT REGEXP_SUBSTR ('Text1!#!Text2!#!Text#3!#!',
                      '(.*?)(!#!|$)',
                      1,
                      LEVEL,
                      '',
                      1)
              AS VAL
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('Text1!#!Text2!#!Text#3!#!',
                          '(.*?)(!#!|$)',
                          1,
                          LEVEL,
                          '',
                          1)
IS NOT NULL

输出:

VAL
Text1
Text2
Text#3

Demo on dbfiddle

【讨论】:

  • 谢谢,这很有帮助!
  • @PrakashS 不用担心 - 我很高兴能提供帮助。
【解决方案2】:

您可以使用正向的后视和前瞻来解决这个问题。

简单地说:

  • 匹配任何(.+?)
  • 在文本的开头或前面有图案(?<=^|!#!)
  • 并且在文本的末尾或有(?=!#!|$) 后面的模式

在此处查看您的示例:https://rubular.com/r/f6BDr9CxeaQTIz 使用 (?<=^|!#!)(.+?)(?=!#!|$)

【讨论】:

  • 请注意,Oracle 的正则表达式引擎支持环视。虽然这可能是一个通用解决方案,但它不适用于 Oracle。
  • @TimBiegeleisen 所以我们不能用 Oracle 中的正则表达式解决这个问题吗?
  • 如果您的 Oracle 表包含这种类型的数据,那么您的数据远未标准化。你应该修复你的数据模型。
  • 对不起,我不知道 Oracle 正则表达式引擎的局限性。但也许您可以将表达式与一个简单的模式(例如(.+?!#!))进行匹配,然后在第二步中删除该模式?
猜你喜欢
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多