指定字符串校验规则下Javascript regex优化实现需求
Javascript 正则优化方案
适用规则梳理
允许使用的字符
- 大写英文字母A-Z
- 小写英文字母a-z
- 连字符(hyphen)
- 撇号(apostrophe)
- 单引号(single quote)
- 空格
- 句号(full stop)
- 数字0-9
校验规则
- 必须包含至少一个字母字符
- 不可出现连续非字母字符,仅允许两种例外:句号后接空格、撇号后接空格
- 开头不可出现非字母字符(撇号除外)
- 允许以句号结尾
原有参考正则
/^(?=[a-zA-Z0-9'. -]+$)(?!.*[0-9' -]{2})[a-zA-Z'][^\r\n.]*(?:\.[ a-z][^\r\n.]*)*$/
优化后最终正则
/^(?=.*[a-zA-Z])(?=[a-zA-Z0-9'’- ]+$)(?!.*[^a-zA-Z]{2}(?<!\. )(?<!' ))[a-zA-Z'](?:[^.\r\n]*(?:\. [^.\r\n]*)*)?\.?$/
正则逻辑拆解
(?=.*[a-zA-Z]):正向预查,强制整个字符串至少包含1个字母,满足基础规则第一条要求(?=[a-zA-Z0-9'’- ]+$):正向预查,限制所有字符只能是规则允许的范围内的字符,避免出现非法字符(?!.*[^a-zA-Z]{2}(?<!\. )(?<!' )):负向预查,排除所有连续两个非字母的场景,仅豁免「句号+空格」「撇号+空格」两种合法连续非字母组合[a-zA-Z']:限制字符串开头只能是字母或者撇号,满足「开头不可出现非字母字符(撇号除外)」的要求(?:[^.\r\n]*(?:\. [^.\r\n]*)*)?:匹配中间合法内容,支持出现规则允许的「句号+空格」组合\.?$:支持字符串末尾以可选的句号结尾,匹配新增规则要求
校验结果验证
有效示例(全部匹配通过)
- 'Andy
- Andy.
- Andy' De'Wall
- Andy. DeWa2e
- A2dy'
无效示例(全部匹配不通过)
- 2Andy:开头为数字,不符合开头规则
- A2'ndy.:存在「数字+撇号」的连续非字母组合,不符合规则
- Andy'-Wall:存在「撇号+连字符」的连续非字母组合,不符合规则
- Andy. DeWa23:存在「2+3」连续数字的非字母组合,不符合规则
- A24dy':存在「2+4」连续数字的非字母组合,不符合规则
内容的提问来源于stack exchange,提问作者rebel
相关产品推荐
相关产品推荐

