我想
a
,但不是 b
,A-Za-z0-9
可以包含任意次-这些字符\@\,\.
除外,只能包含一次。at least 3 characters long
。 我该如何实现?我的方法行不通,因此无法在文档中找到参考。
a='em@il';
b='em@@l';
%more examples
a2='em@il, test.'; %<- correct
a3='email, test'; %<- correct
b2='em@il, test,'; %<- incorrect 2x ','
b3='em@ail, test. @bc. %<- incorrect 2x '@'
regexp({a,b},'[A-Za-z0-9 (\@\,\.){1}]{3,}','match','once')
ans =
1×2 cell array
{'em@il'} {'em@@l'}
^(?!.*([,.@]).*\1)[a-zA-Z0-9 @,.]{3,}$
部分
[
^
字符串的开头
(?!
负前瞻,如果右边没有.*([,.@])
在组1中捕获,
.
或@
.*\1
使用后向引用匹配在组1中捕获的内容)
关闭前瞻[a-zA-Z0-9 @,.]{3,}
匹配列出的3次以上]$
字符串结尾^(?!.*@.*@|.*,.*,|.*\..*\.)[A-Za-z0-9 @,.]{3,}$
如果我理解正确的话,它将接近您的想法。
Demo[如果您想简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果需要,您还可以在this link中查看它如何与某些示例输入匹配。
RegEx电路
[jex.im可视化正则表达式:来源
a-zA-Z0-9 @,.
的任何大于等于3的数字,但使用否定的前瞻断言,.@
在正则表达式中仅匹配一次。这很容易扩展-如果要限制其他字符,只需将它们添加到第一个捕获组。[(?!.*(,|\.|@).*\1.*)
断言:如果找到,.@
之一,则在比赛中其他任何地方都不存在。
^[a-zA-Z0-9 @,\.]{3,}$
在行的开头和结尾之间,匹配列表中的三个或更多有效字符。