【问题标题】:How to write negative lookahead in POSIX regex如何在 POSIX 正则表达式中写负前瞻
【发布时间】:2019-03-23 07:25:07
【问题描述】:

我正在使用 Mac 进行编码,并且正在使用电子邮件地址格式的模式设置正则表达式。

格式为 [recipientname]@[domain].[top-domain]

收件人姓名:

-可以包含数字、字母和特殊字符(仅限于“.”、“+”、“-”和“_”)

-不应有连续的特殊字符(.、+、-、_)

-它不应该以特殊字符开始/结束。

域名

-可以包含数字、字母和“-”字符

热门域名

-com、net 或 org。

我只是不知道如何在 c 中实现否定环视。

以下是我的正则表达式:

^(?!.*(__|--|\+\+|\.\.))(?!.*(_|\-|\+|\.$))[A-Za-z][A-Za-z0-9-+._]*@[A-Za-z0-9-]+\.(com|net|org)$

我遇到了重复运算符操作数无效错误。

编辑: 这是我使用的代码:

#include <regex.h>
#include <stdio.h>

int main()
{

regex_t regex;
int status;
char buffer[100];

status=regcomp(&regex, "^(?!.*(__|--|\\+\\+|\\.\\.))(?!.*(_|\\-|\\+|\\.$))[A-Za-z][A-Za-z0-9-+._]*@[A-Za-z0-9-]+\\.(com|net|org)$", REG_EXTENDED);
regerror(status, &regex, buffer, 100);
printf("%s\n", buffer);

}

【问题讨论】:

  • 你用的是什么正则表达式库?显示您的代码。
  • 现有 已知正确的电子邮件地址正则表达式。生产可能损坏的用例是什么?

标签: c regex


【解决方案1】:

您不需要环顾四周(&lt;regex.h&gt; 不支持)来实现您对收件人姓名的要求:

  • 第一个字符不能特殊,所以我们以[a-zA-Z0-9](字母或数字)开头。
  • 特殊字符不能重复,也不能是最后一个字符,这意味着任何特殊字符后面必须始终跟一个字母或数字:[.+_-][a-zA-Z0-9]
  • 字母和数字可以重复,即我们有一个字母/数字,我们可以有任意多个:[a-zA-Z0-9]+ ... [.+_-][a-zA-Z0-9]+ ...
  • 收件人姓名可以包含0个或多个特殊字符,所以我们要重复第二部分:[a-zA-Z0-9]+([.+_-][a-zA-Z0-9]+)*

就是这样。


(_|\-|\+|\.$)(来自您的前瞻模式)无论如何都被破坏了:它只锚定\.(其他替代方案未锚定),并且它锚定到整个字符串的末尾,而您真正想要的是锚定到收件人姓名的末尾。

此外,您的模式匹配无效电子邮件地址(例如a@---.com)并拒绝许多有效地址(例如f*ck@example.comjdoe@support.example.coma@[127.0.0.1])。

【讨论】:

    猜你喜欢
    • 2017-08-26
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多