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不知道“捕获”必须用非捕获组来代替。您应该使用所使用的语言标记与正则表达式相关的问题。