RegEx验证国家保险号码

efzxgjgh  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(120)

我尝试在JS中使用一些RegEx来验证国家保险号码。

^(?i:[a-z-[dfiquv]])(?i:[a-z-[dfiquvo]])\d{6}(?i:a|b|c|d)$

这是从一个不是JS的语言中提取的,但是我如何在JS中使用这个规则呢?
我想我应该在这里转义一些字符。
谢谢!

oknrviil

oknrviil1#

你的模式相当于这样:

/^[abceghj-prstw-z][abceghj-nprstw-z]\d{6}[abcd]$/i

由于这个原因,原始模式在JavaScript中不起作用:
XRegExp(JavaScript正则表达式引擎)不支持字符类减法。因此,[a-z-[dfiquv]]将被视为:

[a-z-[dfiquv] # a character class that contains:
              #     the character range a-z
              #     -
              #     [
              #     the (duplicate) letters: dfiquv

]             # followed by a literal ]

关于原始图案的另一个注意事项:XRegExp不支持非捕获组语法中的inline修饰符:(?i:......)(that is a shortcut for(?:(?i)......), note that javascript doesn't support(?i)too, it doesn't support inline modifiers at all)。由于所有模式似乎都不区分大小写,最好的方法是将所有模式的修饰符如下所示:/... pattern .../i并删除不需要的非捕获组。

elcex8rz

elcex8rz2#

这与JS兼容的正则表达式相当接近,只是做了一些小的修改,试试这个:

/^(:[a-z][dfiquv])(:[a-z][dfiquvo])\d{6}(:[abcd])$/i
voase2hg

voase2hg3#

我需要大规模验证英国国民保险号码,偶然发现了这篇文章。然而,我发现使用正则表达式进行验证真的很慢。所以我创建了这个npm包,它不使用regex,速度大约快14倍:test-nino .只是想我会分享,以防其他人需要更高性能的解决方案。

相关问题