regex 如何使用正则表达式拒绝一个数字序列中的两个数字?[closed]

bfhwhh0e  于 2023-02-25  发布在  其他
关注(0)|答案(3)|浏览(134)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

3天前关闭。
截至2天前,社区正在审查是否重新讨论此问题。
Improve this question
我们得到的数据范围是01 - 59和61 - 99。我需要创建一个模式,当值为00或60时,该模式将失败。
我的正则表达式技能是边缘的,所以帮助是感激的。
语言为PL/SQL,具有有限的正则表达式匹配。

    • 编辑:**

尽可能清楚和简明;
我需要一个正则表达式模式,这将允许任何2位数被接受,除了"00"和"60"。
这必须是一个正则表达式,而不是任何过程代码,因为正则表达式存储在表中,并由处理例程用来验证传入的数据。
一个备选办法可能是:

^(01|02|03|04|05...|59|61|62|63|64|65...|99)$

其中省略号是中间的2位数字。然而,这是我讨厌的大量打字。

ccrfmcuu

ccrfmcuu1#

不清楚为什么需要正则表达式--检查值肯定是:

between 1 and 59 or between 61 and 99

更容易吗
如果必须使用regex,PL/SQL对此有广泛的支持。

begin
  for vals in 59 .. 61 loop
    if regexp_like ( vals, '(00)|(60)' ) then
      dbms_output.put_line ( vals || ' = fail' );
    else
      dbms_output.put_line ( vals || ' = pass' );
    end if;
  end loop;
end;

59 = pass
60 = fail
61 = pass
hrirmatl

hrirmatl2#

答案似乎是:

^(?!.*00|.*60).\d$

这将否定特定的字符组(00或60),并允许其他数字。
我无法编辑我的问题来解释以下内容;
我们在表中存储一个正则表达式,用于验证每个字段的传入字符串,而不是硬编码每个传入字段的验证。每行有超过400个传入数据元素。

cedebl8k

cedebl8k3#

--Assumption: vals is 2 digit 
--Having two comparisons gives some flexibility in adjusting if necessary.
-- 'i' optional meaning ignore case sensitivity
where
         regexp_like(vals,'^[0-9][0-9]$','i') --Set of Numbers to INCLUDE
and  NOT regexp_like(vals,'^[0,6][0]$','i')     --Set of Numbers to EXCLUDE

with set_of_numbers as
(
select '00' as valid_yn from dual union all
select '01' as valid_yn from dual union all
select '02' as valid_yn from dual union all
select '59' as valid_yn from dual union all
select '60' as valid_yn from dual union all
select '61' as valid_yn from dual union all
select '99' as valid_yn from dual)
select valid_yn 
from set_of_numbers
where 
         regexp_like(valid_yn,'^[0-9][0-9]$','i') --Set of Numbers to INCLUDE
and  NOT regexp_like(valid_yn,'^[0,6][0]$','i')  --Set of Numbers to EXCLUDE
;

相关问题