我正在使用Vbscript / Classic Asp / Vb6
我希望匹配所有电子邮件至少有域名.com除了something.com,我尝试使用以下表达式但是没有工作
@(?!东西).COM $
答案 0 :(得分:3)
你也需要引入积极的比赛。什么是匹配的电子邮件域名? 好吧,如果你无法控制域编码,它可能已被打扰,但它更可能包含非ascii字符。如果是这种情况,那么通常情况下,更容易宽松而不是真正试图表达可能的域名的完整复杂性。因此,我的建议是关注域的结构,而不是合法的确切字符;但正确的选择取决于您的需要。
.com
域的合理简单正则表达式可能类似于:
([^.]+\.)+com$
包括必须以@
开头而不是something.com
的限制:
@(?!something\.com$)([^.]+\.)+com$
请注意,否定前瞻包含.com
和终止符号$
,但不会错误地拒绝somethingelse.com
或something.comedy.com
。
一个限制是,这会接受invalid domains,例如_.com
或hmm-.com
,因此,如果您更愿意拒绝此类案例(还有国际化域名),您可以写:< / p>
@(?!something\.com$)(([a-z0-9][-a-z0-9]*)?[a-z0-9]\.)+com$
这确保了所有标签的有效字符,允许多个标签(例如mail.google.com
中的“mail”和“google”),并确保没有标签可以以连字符开头或结尾。
编辑:如果您还要强制执行253个字符的总长度和每个标签的63个字符长度限制,您可以执行以下操作:
@(?!.{254})(?!something\.com$)(([a-z0-9][-a-z0-9]{0,61})?[a-z0-9]\.)+com$
限制:不幸的是,由于VBScript的unicode-foo很弱,因此允许的unicode字符的正则表达式相当大(很多字符范围)。最后,这个正则表达式没有考虑套管:DNS也没有,所以应该没问题,但记得在不区分大小写的模式下运行它或者在测试之前规范化为小写。
然而,老实说:我不会这样做。保持简单 - 如果输入了无效的电子邮件地址,您真的在乎吗?然后验证电子邮件 - 没有多少语法检查将真正起作用。一些简单的基本检查 - 比如它有一个@
,一个.
而不是something.com
的结尾应该可以捕获大多数意外错误;但除非你真的需要,否则不要理会这种详细的方法。
答案 1 :(得分:2)
您忘记指定允许的域名。试试这个:
@(?!something\.com)([A-Za-z0-9]+\.com)$
如果需要,您可以添加比A-Z,a-z和0-9更多的字符。 此外,你应该在正则表达式中转义一个点,因为点是一个特殊字符(它匹配每个字符)。