如何用正则表达式匹配字符串中@符号恰好0次或1次?
搞定@出现0次或1次的正则匹配需求
你要的是整个字符串里@只能有0个或者1个,不管它在开头、中间还是结尾对吧?你之前试的^[^@]*@[^@]*$其实能匹配所有@出现1次的情况(包括开头、结尾的场景哦,你之前可能测试错啦),但它的问题是必须要有一个@,没法匹配完全没@的字符串。
那咱们改一下,把@的部分改成可选的就好啦,最终的正则是:
^[^@]*@?[^@]*$
给你拆解下这个正则的逻辑:
^锚定字符串开头[^@]*匹配任意个(包括0个)不是@的字符@?这是关键:匹配0个或者1个@,完美满足你的0次或1次要求[^@]*再匹配任意个(包括0个)不是@的字符$锚定字符串结尾
对应你的测试场景验证下:
能匹配的有效情况:
@foobar→ 开头是@,后面全是非@字符,没问题foo@bar→ 中间一个@,前后都没问题foobar@→ 结尾是@,前面全是非@字符,匹配成功fooba@r→ 中间插了个@,符合要求- 甚至完全没@的
foobar也能匹配,满足0次的需求
会被排除的无效情况:
@@foobar→ 两个@,直接不匹配@foo@bar→ 两个@,被排除foo@b@ar→ 两个@,不符合规则
要是你还想禁止空字符串(比如不允许输入啥都没有的情况),可以用这个版本:
^[^@]+@?[^@]*$|^[^@]*@?[^@]+$
这个会要求字符串至少有一个非@的字符,同时@最多出现一次。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

