【问题标题】:Using LookAhead to ensure there is at least one % in a string使用 LookAhead 确保字符串中至少有一个 %
【发布时间】:2015-02-05 12:02:27
【问题描述】:

我正在尝试在下面给定的正则表达式中添加一个条件,以检查至少有一个特殊字符 %(百分号)以 W 开头,另外五个字符可能介于 A-Z 之间、0-9%。我自己尝试使用 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}$]')

【问题讨论】:

  • iirc、oracle regexen 不支持前瞻。
  • 这真的很不幸。是否有其他方法可以检查上述表达式是否包含至少一个 % 特殊字符。谢谢。选择'P' from dual Where REGEXP_LIKE('W77%7%','(^W[0-9A-Z%]{5}$)')

标签: sql regex oracle


【解决方案1】:

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

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

附:如果 Oracle 确实 在其正则表达式中支持前瞻,我认为您要查找的正则表达式看起来像这样:

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

See Regex demo here.

更新 可以在 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}%)');

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 2022-11-16
    • 2023-01-10
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多