我正在尝试使用REGEXP_LIKE
构建一个Oracle查询,以便在“something”之后的括号内查找包含数字68的所有记录:something:(...)
因此以下字符串应与我的搜索匹配:
这些字符串不匹配我的搜索:
我正在尝试这个:
^.*?something:\((.*68.*)\).*$
但这是搜索68直到文本结束并匹配668。
由于
答案 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-9)]
- 除数字以外的字符)
68
- 字面值([^0-9)][^)]*)?
- 可选的模式序列:
[^0-9)]
- 除数字以外的字符)
[^)]*
- 除)
\)
- 文字)
。