正则表达式如何匹配恰好7位或9位数字,现有写法无法生效如何解决?
问题原因分析
- 你尝试的前两种写法没有限定匹配边界,正则会从任意长度的数字串中截取符合长度要求的片段,导致8位数字的前7位、9位数字的前7位被误提取
- 或运算符
|是左优先匹配,你把7位的规则写在左边,遇到9位数字时会优先匹配到前7位就返回,不会继续匹配更长的9位规则 - 第三种写法的
^和$是全局首尾锚点,仅适用于「校验整个输入字符串是否符合规则」的场景,如果你是从大段文本中提取子串,这两个锚点会导致完全匹配不到结果 - 你用的引擎不支持
\d语法,所以所有数字匹配统一用[0-9]即可
对应解决方案
场景1:校验整个输入字符串是否为合法数字
直接修改你第三种写法的\d为[0-9]即可:
/^([0-9]{7}|[0-9]{9})$/
该规则仅当整个输入串恰好是7位或者9位数字时匹配成功。
场景2:从大段文本中提取独立的合法数字子串
优先匹配长规则+零宽断言限定前后无其他数字,写法如下:
/(?<![0-9])(?:[0-9]{9}|[0-9]{7})(?![0-9])/
各部分规则说明:
(?<![0-9]):负向逆序断言,限定匹配到的数字前不能有其他数字(?:[0-9]{9}|[0-9]{7}):非捕获组,把9位规则放在左侧优先匹配,避免9位数字被拆分为7位返回(?![0-9]):负向顺序断言,限定匹配到的数字后不能有其他数字
如果你的正则引擎不支持零宽断言,且待匹配的数字前后都是非字母、非下划线的字符,可以用单词边界简化:
/\b(?:[0-9]{9}|[0-9]{7})\b/
内容的提问来源于stack exchange,提问作者John Parham
相关产品推荐
相关产品推荐

