Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于序列号验证的正则表达式_Regex_Oracle_Validation - Fatal编程技术网

Regex 用于序列号验证的正则表达式

Regex 用于序列号验证的正则表达式,regex,oracle,validation,Regex,Oracle,Validation,我需要为序列号验证编写一个正则表达式。 序列号可以有两种类型 AA.BB.CCC其中A、B和C是0到9之间的数字 AA.BB.CC.DDD.EEE.FF.GGGH其中A、B、C、D、E、F和G是数字,H是字符,也AA.BB.CC.DDD,AA.BB.CC.DDD.EEE,AA.BB.CC.DDD.EEE.FF和AA.BB.CC.DDD.EEE.GGG 它们也是有效的 例如: 01.01.001-有效 01.01.01.001-有效 01.01.01.001.001-有效 01.01.01.001

我需要为序列号验证编写一个正则表达式。 序列号可以有两种类型

  • AA.BB.CCC
    其中A、B和C是0到9之间的数字
  • AA.BB.CC.DDD.EEE.FF.GGGH
    其中A、B、C、D、E、F和G是数字,H是字符,也
    AA.BB.CC.DDD
    AA.BB.CC.DDD.EEE
    AA.BB.CC.DDD.EEE.FF
    AA.BB.CC.DDD.EEE.GGG
    它们也是有效的
  • 例如:
    01.01.001-有效
    01.01.01.001-有效
    01.01.01.001.001-有效
    01.01.01.001.001.01-有效
    01.01.01.001.001.01.001-有效
    01.01.01.001.001.01.001a-有效

    01.01.01.001.01-无效
    01.01.01.001.001a-无效
    01.01.01.001.01.001-无效
    01.01.01.001.01.001a-无效
    01.01.01.001.001.001-无效
    01.01.01.001.001.001a-无效

    目前我使用两个regexp
    '(\d{2}){3}\d{3}(\.\d{3})(\.\d{2})(\.\d{3}(\w)?)?)?)?)?$”
    '(\d{2}\){2}\d{3}$'


    有没有办法将这两个正则表达式结合在一起?

    您确实可以使用一个正则表达式将这两个正则表达式连接起来,但您也需要相应地将它们连接起来:

    ^((\d{2}\.){3}\d{3}((\.\d{3})((\.\d{2})(\.\d{3}(\w)?)?)?)?|(\d{2}\.){2}\d{3})$
    ^^                                                        ^^                ^
    

    看。不要忘记
    ^
    /
    $
    锚定,以确保整个字符串符合模式。

    您可以在单个正则表达式中完成这一切:

    ^\d\d\.\d\d\.\d\d(\d|\.\d{3}(\.\d{3}(\.\d\d(\.\d{3}[A-H]?)?)?)?)$
    
    然后,您始终可以提取捕获组以获取序列号组件:

    CREATE TABLE serial_numbers ( serial_number ) AS
    SELECT '01.02.03'                 FROM DUAL UNION ALL
    SELECT '01.02.003'                FROM DUAL UNION ALL
    SELECT '01.02.03.004'             FROM DUAL UNION ALL
    SELECT '01.02.03.004.005'         FROM DUAL UNION ALL
    SELECT '01.02.03.004.005.06'      FROM DUAL UNION ALL
    SELECT '01.02.03.004.005.06.007'  FROM DUAL UNION ALL
    SELECT '01.02.03.004.005.06.007A' FROM DUAL;
    
    SELECT serial_number,
           REGEXP_SUBSTR( serial_number, '^(\d\d)', 1, 1, NULL, 1 ) AS AA,
           REGEXP_SUBSTR( serial_number, '^\d\d\.(\d\d)', 1, 1, NULL, 1 ) AS BB,
           REGEXP_SUBSTR( serial_number, '^\d\d\.\d\d\.(\d\d\d?)', 1, 1, NULL, 1 ) AS CCC,
           REGEXP_SUBSTR( serial_number, '^\d\d\.\d\d\.\d\d\.(\d{3})', 1, 1, NULL, 1 ) AS DDD,
           REGEXP_SUBSTR( serial_number, '^\d\d\.\d\d\.\d\d\.\d{3}\.(\d{3})', 1, 1, NULL, 1 ) AS EEE,
           REGEXP_SUBSTR( serial_number, '^\d\d\.\d\d\.\d\d\.\d{3}\.\d{3}\.(\d\d)', 1, 1, NULL, 1 ) AS FF,
           REGEXP_SUBSTR( serial_number, '^\d\d\.\d\d\.\d\d\.\d{3}\.\d{3}\.\d\d\.(\d{3})', 1, 1, NULL,  1 ) AS GGG,
           REGEXP_SUBSTR( serial_number, '^\d\d\.\d\d\.\d\d\.\d{3}\.\d{3}\.\d\d\.\d{3}([A-H])', 1, 1, NULL,  1 ) AS H
    FROM   serial_numbers
    WHERE  REGEXP_LIKE( serial_number, '^\d\d\.\d\d\.\d\d(\d|\.\d{3}(\.\d{3}(\.\d\d(\.\d{3}[A-H]?)?)?)?)$' );
    
    输出

    SERIAL_NUMBER            AA BB CCC DDD EEE FF GGG H
    ------------------------ -- -- --- --- --- -- --- -
    01.02.003                01 02 003                  
    01.02.03.004             01 02 03  004              
    01.02.03.004.005         01 02 03  004 005          
    01.02.03.004.005.06      01 02 03  004 005 06       
    01.02.03.004.005.06.007  01 02 03  004 005 06 007   
    01.02.03.004.005.06.007A 01 02 03  004 005 06 007 A
    

    是的,使用
    字符对我不起作用可能是oracles regexp不理解分组,这可以
    ^(((\d{2}){3}(\.\d{3})((\.\d{3})(\.\d{2})(\.\d{3}(\w)?)?)?){124$(\ d{2}.\d{3})是真的,Oracle不知道“捕获”必须用非捕获组来代替。您应该使用所使用的语言标记与正则表达式相关的问题。