2

简洁版本:

如何使用CAtlRegExp获得匹配 a@a.aaaa 但不匹配 a@a.aaaaa 的正则表达式?


长版:

我正在使用 CAtlRegExp http://msdn.microsoft.com/en-us/library/k3zs4axe(VS.80).aspx来尝试匹配电子邮件地址。我想使用正则表达式

^[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}$

这里提取。但是 CAtlRegExp 接受的语法不同于那里使用的语法。此正则表达式返回错误 REPARSE_ERROR_BRACKET_EXPECTED,您可以使用此应用程序自行检查:http: //www.codeproject.com/KB/string/mfcregex.aspx

使用所述应用程序,我创建了这个正则表达式:

^[a-zA-Z0-9\._%\+\-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]$

但问题是这匹配 a@a.aaaaa 为有效,我需要它来匹配操作级域的最多 4 个字符。

那么,如何获得匹配 a@a.aaaa 但不匹配 a@a.aaaaa 的正则表达式?

4

2 回答 2

2

尝试:^[a-zA-Z0-9\._%\+\-]+@([a-zA-Z0-9-]+\.)+\c\c\c?\c?$

此表达式将[A-Z]{2,4}CAtlRegExp 不支持的序列替换为\c\c\c?\c?

\c用作 的缩写[a-zA-Z]。第 3 和第 4 之后的问号\c表示它们可以匹配零个或一个字符。因此,这部分表达式匹配 2、3 或 4 个字符,但不多也不少。

于 2009-08-19T06:47:52.363 回答
1

您正在尝试匹配电子邮件地址,这是互联网通信中一个非常广泛使用的关键元素。

我会说这项工作最好使用最广泛使用的最正确的正则表达式来完成。

由于 RFC822 描述了电子邮件地址格式规则,因此在互联网上搜索“RFC822 电子邮件正则表达式”之类的内容似乎很有用。

对于 Perl,答案似乎很简单:使用Mail::RFC822::Address: regexp-based address validation

PHP 中的 RFC 822 电子邮件地址解析器

因此,为了实现对电子邮件地址的最正确处理,一个人应该找到特定工具包(在您的情况下为 ATL)某个地方存在的最精确的正则表达式,或者 - 如果还没有合适的现有正则表达式 - 适应一个非常精确的另一个工具包的正则表达式(上面的 Perl 似乎是一个非常完整的候选者,尽管很困难)。

如果您尝试匹配电子邮件地址的特定子部分(根据您的问题似乎就是这种情况),那么从最新/正确/通用正则表达式开始并特别限制可能仍然有意义它到您需要的部分。

也许我说的是显而易见的,但我希望它有所帮助。

于 2012-02-21T09:33:50.313 回答