如何编写满足指定字符规则、首尾均为字母的正则表达式?
符合要求的正则表达式
你可以使用如下兼容大部分主流正则引擎的表达式:
^[a-zA-Z](?:[a-zA-Z0-9]|_(?=[a-zA-Z0-9])|,(?=[a-zA-Z]))*[a-zA-Z]$
如果需要支持单字母的合法情况(比如单独的a也算合法),可以调整为:
^[a-zA-Z](?:(?:[a-zA-Z0-9]|_(?=[a-zA-Z0-9])|,(?=[a-zA-Z]))*[a-zA-Z])?$
规则匹配说明
你原来的写法存在两个问题:一是字符集内的括号会被识别为普通字符,二是完全没有限制下划线、逗号的前后相邻字符,调整后的表达式逻辑拆解如下:
- 首尾限制:
^[a-zA-Z]和[a-zA-Z]$强制要求字符串首尾必须是字母,满足第一个规则 - 合法字符范围:仅允许字母、数字、下划线、逗号四类字符出现在字符串中,满足第二个规则
- 下划线限制:下划线分支
_(?=[a-zA-Z0-9])通过正向预查强制下划线后必须跟字母/数字;同时由于下划线只会出现在这个分支,前面的字符必然是字母/数字,刚好满足下划线只能出现在字母/数字之间的要求 - 逗号限制:逗号分支
,(?=[a-zA-Z])通过正向预查强制逗号后必须跟字母;同理逗号前面的字符必然是字母,满足逗号只能出现在两个字母之间的要求
测试用例参考
匹配成功的合法字符串
HelloWorlda1_b2,c3Test,Case_123
匹配失败的非法字符串
123abc(开头为数字)ab_cd,1(逗号后为数字)a,_b(逗号后为下划线)ab_(结尾为下划线)a-b(包含非法字符横杠)
内容的提问来源于stack exchange,提问作者Saratean Timeea
相关产品推荐
相关产品推荐

