正则表达式在特定括号之间查找特定文本

时间:2017-10-23 18:46:53

标签: regex oracle

我正在尝试使用REGEXP_LIKE构建一个Oracle查询,以便在“something”之后的括号内查找包含数字68的所有记录:something:(...)

因此以下字符串应与我的搜索匹配:

  • 其他:(45或1)某事:(78或68或5)
  • 某事:(68或5)事:(57)
  • some:(888)某事:(68)事:(57)

这些字符串匹配我的搜索:

  • 某事:(5)事:(68)
  • 的内容:(的 668

我正在尝试这个:

^.*?something:\((.*68.*)\).*$

但这是搜索68直到文本结束并匹配668。

由于

1 个答案:

答案 0 :(得分:1)

让我们检查你的正则表达式匹配的内容:

  • ^ - 字符串开头
  • .*?something:\( - 任何0 +字符,直到第一次出现
  • (.*68.*) - 第1组:尽可能多地使用0 +字符68因此可以在与其他数字一起使用时匹配!)然后再0+字符,尽可能多
  • \) - 文字)
  • .* - 尽可能多地使用0+字符
  • $ - 字符串结束。

如您所见,它严重依赖效率非常低的.*模式,并且不会阻止68中的1236835匹配。

您需要达到的目标是仅在以下位置匹配68

  • (之后或(之后跟随)以外的任意数量的字符,并且在非数字之后(也是非()< / LI>
  • 但在)之前或非数字之前,而非)之后是除)以外的任何0 +字符,后跟)

此模式可以写为

something:\(([^)]*[^0-9)])?68([^0-9)][^)]*)?\)

请参阅regex demo

另请参阅我的Oracle tests

<强>详情

  • something:\( - 文字something:(子字符串
  • ([^)]*[^0-9)])? - 可选的模式序列:
    • [^)]* - 除)
    • 以外的0个字符
    • [^0-9)] - 除数字以外的字符)
  • 68 - 字面值
  • ([^0-9)][^)]*)? - 可选的模式序列:
    • [^0-9)] - 除数字以外的字符)
    • [^)]* - 除)
    • 以外的0个字符
  • \) - 文字)