使用LookAhead确保字符串中至少有一个%

时间:2015-02-04 20:27:21

标签: sql regex oracle

我正在尝试在下面给出的正则表达式中添加一个条件,以检查至少有一个特殊字符%(百分号)以W开头,还有五个字符可能是在A-Z0-9%之间。我试着自己使用LookAhead (?=.*[%]),但遗憾的是没有为我工作。下面是一个表达式我想检查一个字符串中至少有一个或多个%字符使用lookahead或其他语法。提前谢谢。

尝试在此表达式上添加前瞻:

Select 'P' from dual Where REGEXP_LIKE('W77%7%','(^W[0-9A-Z%]{5}$)')

尝试:

Select 'P' from dual Where REGEXP_LIKE('W77%7%','^(?=(^%){0,6}) [^W[0-9A-Z%]{5}$]')

尝试:

Select 'P' from dual Where REGEXP_LIKE('W77%7%','^(?=.*%){0,6}) [^W[0-9A-Z%]{5}$]')

1 个答案:

答案 0 :(得分:1)

Oracle的正则表达式引擎基本上是POSIX ERE正则表达式,带有一些增强功能,这意味着,除其他外,没有任何外观。但我不确定为什么你需要先行才能确定特定字符串是否包含%字符。

SELECT 'P' FROM dual
 WHERE REGEXP_LIKE('W77%7%', '^W[0-9A-Z%]{5}$')
   AND INSTR('W77%7%', '%') > 0;

P.S。如果Oracle 在其正则表达式中支持预测,我认为您要查找的正则表达式将如下所示:

^(?=.*%)W[0-9A-Z%]{5}$

See Regex demo here.

UPDATE 可以在Oracle中使用单个正则表达式执行此操作,但没有其他条件,但它不是很好。基本上,您必须考虑%的每个可能位置:

SELECT 'P' FROM dual
 WHERE REGEXP_LIKE('W77%7%', '^W(%[0-9A-Z%]{4}|[0-9A-Z%]%[0-9A-Z%]{3}|[0-9A-Z%]{2}%[0-9A-Z%]{2}|[0-9A-Z%]{3}%[0-9A-Z%]|[0-9A-Z%]{4}%)');