Oracle REGEXP_LIKE奇怪的行为

时间:2017-08-23 14:56:11

标签: oracle11g

有一个简单的查询它没有一组参数,但它适用于其他参数,它不起作用。

这有效:

  SELECT R.*
FROM ROUTEUSER.AHC_B2B_ROUTE R
WHERE R.PRODUCER = 'Encounters'
AND REGEXP_LIKE ('tplmcoce.41.20170822.txt', R.FILEMASK, 'i')

这不起作用

    SELECT R.*
FROM ROUTEUSER.AHC_B2B_ROUTE R
WHERE R.PRODUCER = 'Facets'
AND REGEXP_LIKE ('SMS-0162628062', R.FILEMASK, 'i')

如果我在数据库中有一个名为Filemask(REGEX Pattern)的列,那么如何为给定的字符串(文件名)选择匹配模式?

当我尝试第二个查询时,我收到以下异常:

ORA-12725: unmatched parentheses in regular expression 12725. 00000 - "unmatched 
           parentheses in regular expression" 
*Cause: The regular expression did not have balanced parentheses. 
*Action: Ensure the parentheses are correctly balanced.  

4 个答案:

答案 0 :(得分:0)

这是一个想法......

select *
from   <your_table>
where  regexp_count( FILEMASK, '\(' )  !=  regexp_count( FILEMASK, '\)' )
;

你应该找到至少一个PRODUCER =&#39; Facets&#39; (或许更多?)

......虽然这可能还不够。考虑这个正则表达式:'\(abc)'(您的意思是'\(abc\)')。您需要字符串abc周围的文字括号。但是你只是逃过了左括号,忘了逃避收尾。对于正则表达式,这是一个错误:转义的括号被视为任何其他字符,它不是&#34;特殊的&#34;以任何方式;这使得右括号成为一个特殊字符,并且不与开头括号匹配。

另一方面,我的上述解决方案无法区分转义括号和非转义括号 - 它们对它们的处理方式完全相同,因此'\(abc)'看起来非常好。如果我上面发布的内容还不够,你/我们将需要更多微妙的想法。也许:

...
where regexp_count( FILEMASK, '([^\]|^)\(' )  !=  regexp_count( FILEMASK, '([^\]|^)\)'

这仅查找非转义括号。 [^\]表示&#34;除反斜杠&#34;以外的任何字符,([^\]|^)表示该字符串或字符串的开头。

答案 1 :(得分:0)

此问题已解决。这是因为我有一个错误的正则表达式(错过了一个括号)导致失败。 REGEX_LIKE开始比较表列中的每个掩码,当它出现失败的坏正则表达式时。

请关闭此问题。

谢谢大家。

答案 2 :(得分:-1)

SELECT R. * 来自ROUTEUSER.AHC_B2B_ROUTE R. R.PRODUCER =&#39; Facets&#39; AND REGEXP_LIKE(&#39; ^ SMS [ - ] 0162628062 $ *&#39;,R.FILEMASK,&#39; i&#39;)----尝试让我们知道输出....... ...............

答案 3 :(得分:-2)

使用[]逃离'\'中的字符。并且您必须在第二种模式('.')中将最后一个字符*替换为'SMS...'

^tplmcoce[\.](37|41|47|57)[\.].*[\.]txt$
and 
^SMS[\-]0162628062$*


SELECT 1 Matched
  FROM DUAL
 WHERE REGEXP_LIKE ('tplmcoce.41.20170822.txt',
                    '^tplmcoce[\.](37|41|47|57)[\.].*[\.]txt$', 'i');


SELECT 1 Matched
  FROM DUAL
 WHERE REGEXP_LIKE ('SMS-0162628062', '^SMS[\-]0162628062$*', 'i')