Как написать отрицательный взгляд в POSIX регулярное выражение - PullRequest
0 голосов
/ 23 марта 2019

Я пишу код на Mac и настраиваю регулярное выражение с шаблоном формата адреса электронной почты.

Формат: [имя получателя] @ [домен]. [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);

}

1 Ответ

2 голосов
/ 23 марта 2019

Вам не нужны осмотры (которые <regex.h> не поддерживает) для реализации ваших требований к имени получателя:

  • Первый символ не должен быть специальным, поэтому мы начнем с[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.com, jdoe@support.example.com, a@[127.0.0.1]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...