1

我正在使用 Vbscript/经典 Asp/Vb6

我想匹配所有电子邮件的域至少为 .com 除了 something.com ,我尝试使用以下表达式但不工作

@(?!something).com$

4

2 回答 2

3

你也需要引入一个积极的匹配。什么是匹配的电子邮件域?好吧,如果您无法控制域编码,它可能已经被 punycoded,但它更有可能包含非 ascii 字符。如果是这种情况,那么一般来说,宽容比真正尝试表达可能的域名的全部复杂性更容易。因此,我的建议是关注域的结构,而不是合法的确切字符;但是正确的选择取决于您的需要。

域的合理简单正则表达式.com可能类似于:

([^.]+\.)+com$

包括它必须在它之前@而不是的限制something.com

@(?!something\.com$)([^.]+\.)+com$

请注意,负前瞻包括.com和 终止符$,它不会错误地拒绝somethingelse.com也不something.comedy.com

一个限制是它接受无效域,例如_.comor hmm-.com,因此如果您希望拒绝此类情况(但也包括国际化域),您可以编写:

@(?!something\.com$)(([a-z0-9][-a-z0-9]*)?[a-z0-9]\.)+com$

这确保了所有标签的有效字符,允许多个标签(例如“mail”和“google” in mail.google.com),并确保没有标签可以以连字符开头或结尾。

编辑:如果您还想强制执行 253 个字符的总长度和每个标签 63 个字符的长度限制,您可以执行以下操作:

@(?!.{254})(?!something\.com$)(([a-z0-9][-a-z0-9]{0,61})?[a-z0-9]\.)+com$

限制:不幸的是,由于 VBScript 的 unicode-foo 很弱,允许的 unicode 字符的正则表达式非常大(很多字符范围)。最后,这个正则表达式没有考虑大小写:DNS 也没有,所以应该没问题,但请记住在不区分大小写的模式下运行它或在测试之前将其标准化为小写。

然而,老实说:我不会这样做。保持简单 - 如果输入了无效的电子邮件地址,您真的关心吗?然后验证电子邮件 - 再多的语法检查都不会真正起作用。一些简单的基本检查——比如它是否有一个@, a.而不是以结尾something.com应该捕获大多数意外错误;但除非你真的需要,否则不要打扰这种详细的方法。

于 2013-08-31T09:41:26.123 回答
2

您忘记指定允许的域。尝试这个:

@(?!something\.com)([A-Za-z0-9]+\.com)$

如果需要,您可以添加比 AZ、az 和 0-9 更多的字符。此外,您应该在正则表达式中转义一个点,因为该点是一个特殊字符(它匹配每个字符)。

于 2013-08-31T09:12:02.057 回答