有一个简单的查询它没有一组参数,但它适用于其他参数,它不起作用。
这有效:
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.
答案 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')