CAtlRegExp表示最多匹配4个字符的正则表达式

时间:2009-08-18 20:20:20

标签: regex atl

简短版本:

如何使用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}$

摘自here。 但是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匹配为有效,我需要它匹配op级域的最多4个字符。

那么,我怎样才能得到一个与a@a.aaaa相匹配的正则表达式而不是a@a.aaaaa?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

我要说的是,这项工作最好用最广泛使用的最正确的正则表达式。

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

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

RFC 822 Email Address Parser in PHP

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

如果您正在尝试匹配电子邮件地址的特定子部分(根据您的问题似乎就是这种情况),那么最开始可能仍然有意义-date / correct / universal regex,特别是将其限制为您需要的部分。

也许我说的很明显,但我希望它有所帮助。