我在Oracle中遇到了REGEXP_LIKE问题。在表CLOB列中有以下数据:
some text 1{000000}some text 2{000000}some text 3{000error001}some text 4{000001}
关键是找到包含无效数据的{000 error 001}。我尝试了下面的正则表达式,它在在线正则表达式测试工具中工作得很好:
\{(?:.(?!\}))+\D+(?:.*?)\}
但是当它被添加到select语句时:
SELECT REGEXP_INSTR('some text 1{000000}some text 2{000000}some text 3{000error001}some text 4{000001}', '\{(?:.(?!\}))+\D+(?:.*?)\}') FROM DUAL;
它根本不工作(返回0)。
知道为什么吗?
我尝试了regex模式的多个组合,但只有这一个显示正确的结果,不幸的是,只有在regexp在线测试工具中。
1条答案
按热度按时间fgw7neuy1#
用于查找花括号之间的字符串的正则表达式,这些字符串至少包含一个可使用的非数字字符
\{
-一个{
字符[0-9]*
-零位或多位[^0-9{}]
-数字以外的字符,{
/}
[^{}]*
-除了{
和}
之外的零个或多个字符}
-一个}
字符。请参见this regex demo。
实际上,您甚至可以使用
\{[^{}]*[^0-9{}][^{}]*}
,但由于有效字符串只包含花括号内的数字,因此上面的表达式很好,甚至更有效。