2012-03-18 2 views
1

Хорошо, у меня есть два шаблона Regex.Исключить адреса электронной почты из веб-адреса Regex

  1. ([a-zA-Z0-9]?http[s]?:\/\/)?((?:(?:\w+)\.)(?:\S+)(?:\.(?:\w+))+?)
  2. [a-zA-Z0-9._-][email protected][a-zA-Z0-9.-]+.[a-zA-Z]{2,6}

Первый отвечает моим потребностям в поиске веб-адреса в строке. Второй отвечает моим потребностям при поиске адресов электронной почты в строке. Однако по какой-то причине первый из них находит адреса электронной почты, которые выглядят так: [email protected] или [email protected]. Мне нужна помощь, чтобы получить этот первый, чтобы он не подбирал эти адреса электронной почты.

+0

Что с ним не так, что соответствует '[email protected] 'или' first.last @ d1.com'? Они похожи на действительный адрес электронной почты для меня? – Robbie

+0

@Robbie, первое регулярное выражение не должно совпадать с такими совпадениями –

+0

Проблема в том, что я должен выпустить два разных типа операторов замены, чтобы я мог превратить эти согласованные значения в ссылки. Первый из них предназначен для поиска веб-адресов, поэтому, когда я создаю HREF I, префикс значения с помощью 'http: //', но в отличие от того, когда я сопоставляю адреса электронной почты, я должен префикс 'mailto:'. –

ответ

0
([a-zA-Z0-9]?http[s]?:\/\/)?((?:(?:\w+)\.)(?:\S+)(?:\.(?:\w+))+?) 

Нарушение этого вниз, есть несколько проблем ...

(   // capture protocol 
[a-zA-Z0-9]? // matches alphanumeric, optionally (do you really want that to start the string before the protoco?) 
http[s]?  // square brackets delimit character class, so are unneccessary here, although don't change functionality 
:\/\/   // matches :// 
)?   // make captured protocol optional 
((?:(?:\w+)\.)(?:\S+)(?:\.(?:\w+))+?) // too many lookaheads, not enough patterns. Innefficient and causing your error 

Я хотел бы заменить регулярное выражение с чем-то более, как это ...

(https?:\/\/)?(\w[-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)? 
+0

вы забыли сбежать // – Viller

+0

да я, спасибо –

+0

Похоже, я забыл добавить свои комментарии тоже, исправил все это сейчас, как я думаю, это должно быть. –

2

Например, вы могли бы исправить это исключая @

([a-zA-Z0-9]? http [s]?: \/\ /)? ((?: (?: \ w +) \.) (?: [^ \ s @] +) (?: \. (?: \ W +)) *?)

и в самом конце предлагаю использовать *? вместо + ?, +? не соответствует 1-ю домена первого уровня без WWW

пока это найти а @ gmail.com

К сожалению, я не имею ни малейшего представления о том, как проверить, что 1-ый символ, прежде чем Найденный подстрока не @

Редактировать: bad solution ^[^ @] *? ([a-zA-Z0-9]? Http [s]?: \/\ /)? ((?: (?: \ W +) \.) (?: [^ \ S @] +) (? : \. (?: \ w +)) *?) проверяет, нет ли @s от начала строки до согласованной части

+0

вы говорите, что последнее Regex правильнее первого с ** edit **? –

+0

последний проверяет, что все символы с начала строки^не являются «@». Если мы попытаемся проверить только один символ, который заставит регулярное выражение соответствовать «mail.com», – Viller

Смежные вопросы