如何编写仅允许字母及最多各1个英文句号、逗号、撇号的regex
错误原因
你原有的正则将量词规则写在了字符组[]内部,字符组仅用于匹配单个位置的单个字符,内部的{0,1}会被识别为{、0、,、1、}这些普通字符,完全无法限制英文句号、逗号、撇号的出现次数,除了会允许多个指定符号重复匹配外,还会错误放行包含{、}、数字的输入。
修正后的正则
如果你允许空字符串匹配,使用如下规则:
^(?![^.]*\.[^.]*\.)(?![^,]*,[^,]*,)(?![^']*'[^']*')[a-zA-Z.,']*$
如果你要求字符串至少有1个字符,将末尾的*替换为+即可:
^(?![^.]*\.[^.]*\.)(?![^,]*,[^,]*,)(?![^']*'[^']*')[a-zA-Z.,']+$
规则说明
- 开头的
^和结尾的$限定匹配整个输入字符串,避免仅部分内容符合要求就判定为合法 - 三个
(?!...)格式的负向前瞻分别做校验:确保字符串中不会出现2个及以上的英文句号、2个及以上的逗号、2个及以上的撇号 - 末尾的
[a-zA-Z.,']限定所有允许出现的字符仅为大小写英文字母、英文句号、逗号、撇号
测试效果
- 合法输入:
String、String.、a,b'c.d、Str.,'均匹配成功 - 非法输入:
str.,..,,,'''、a..b、a,,c、a''d均匹配失败
内容的提问来源于stack exchange,提问作者Suguru Tokuda
相关产品推荐
相关产品推荐

