验证字符串是否为正则表达式模式的开头

Validate that string is the beginning of a regex pattern

本文关键字:模式 开头 正则表达式 字符串 是否 验证      更新时间:2023-09-26

我可以成功验证完整的加拿大邮政编码(如"M1B0A1"(,但如何验证字符串可以是不完整的加拿大邮政编码(如"M1B"(? 我想检查如果以后键入更多字符,现有内容是否可以与正则表达式匹配。 一旦用户输入一个不可能是加拿大 zip 开头的字符串,我想显示一个错误。

我现有的用于验证完整加拿大邮政编码的正则表达式是:

^[ABCEGHJKLMNPRSTVXY]'d[ABCEGHJKLMNPRSTVWXYZ] ?'d[ABCEGHJKLMNPRSTVWXYZ]'d$

我试图通过使用此正则表达式使每个字符可选来修改正则表达式:

^[ABCEGHJKLMNPRSTVXY]?'d?[ABCEGHJKLMNPRSTVWXYZ]? ?'d?[ABCEGHJKLMNPRSTVWXYZ]?'d?$

但是这错误地接受了像"777""HA16"这样的字符串。 我可以使用正则表达式执行此操作,还是必须创建一组不同字符串长度的正则表达式? 我宁愿避免类似的事情

switch(str.length) {
    case 1:
        return /[ABCEGHJKLMNPRSTVXY]/.test(str);
    case 2:
        return /[ABCEGHJKLMNPRSTVXY]'d/.test(str);
    //.... and more
}

解决方案 1

我想您可以使用"OR"|并从您发布的switch-case列表中附加每个正则表达式模式,这样正则表达式实际上会为您完成switch-case的工作。编辑:但是,每个case的顺序应该颠倒过来,以便尽可能匹配最多的字符。

模板

^(A|B|C|D|E|F)$

字母应替换为以下内容

A: the complete regex pattern              (Case 6)
B: regex pattern for first 5 characters    (Case 5)
C: regex pattern for first 4 characters    (Case 4)
D: regex pattern for first 3 characters    (Case 3)
E: regex pattern for first 2 characters    (Case 2)
F: regex pattern for the first character   (Case 1)

最终结果并不漂亮:演示

<小时 />

编辑 [2016 年 2 月 16 日]

解决方案 2

为了避免键入每个案例,您可以嵌套可选组。每个组将表示每个邮政编码字符的模式,以便当第一个字符正确匹配时,下一个字符将是可选的;然后,如果该字符匹配,则下一个字符将成为可选的,依此类推。(这可能是您在第二个正则表达式模式中尝试执行的操作(。

模板

^(A(B(C(D(E(F)?)?)?)?)?)$

字母应按以下方式替换

A: regex pattern for the 1st zip code character   
B: regex pattern for the 2nd zip code character
C: regex pattern for the 3rd zip code character
D: regex pattern for the 4th zip code character
E: regex pattern for the 5th zip code character
F: regex pattern for the 6th zip code character

结果(演示(

^('[ABCEGHJKLMNPRSTVXY']('d('[ABCEGHJKLMNPRSTVWXYZ']( ?('d('[ABCEGHJKLMNPRSTVWXYZ']('d)?)?)?)?)?)?)$

此外,如果您对捕获的组不感兴趣,则可以修改上述内容以使用非捕获组:DEMO。您决定。

我将您的正则表达式更改为^[ABCEGHJKLMNPRSTVXY](?:(?:'d$)|(?:'d[ABCEGHJKLMNPRSTVWXYZ]$)|(?:'d[ABCEGHJKLMNPRSTVWXYZ]'d$)|(?:'d[ABCEGHJKLMNPRSTVWXYZ]'d[ABCEGHJKLMNPRSTVWXYZ]$)|(?:'d[ABCEGHJKLMNPRSTVWXYZ]'d[ABCEGHJKLMNPRSTVWXYZ]'d$))?$

基本上,它将以下正则表达式^[ABCEGHJKLMNPRSTVXY]'d[ABCEGHJKLMNPRSTVWXYZ]'d[ABCEGHJKLMNPRSTVWXYZ]'d$分为 6 个部分,即每个数字,而不是我使第一个是可访问的,接下来的几个是可选的,确保您想要的顺序,也就是说,如果跳过一个数字,它将接受如果这是字符串的末尾,或者如果跳过一个数字后有更多数字,它将失败。

我认为这就是你想要的,这是一个正则表达式101测试。