Софтуерно Инженерство
Loading...
+ Нов въпрос
Maria_ls avatar Maria_ls 383 Точки

[Exercises: Web Technologies Language Specifics] 16.Extract emails - Java script

http://pastebin.com/YQvsNzsG

Здравейте. Патерна ми хваща невалидни мейли, започващи с "."

pattern = /(\b|^)([a-z](?:_?[a-z0-9\-\.]+@[a-z0-9\-]+\.[a-z0-9]+([\.a-z0-9]+)?))\b/g; 

По другия начин, който се получи при C# / (\b|^)([a-z](?:_?[a-z0-9\-\.]+@[a-z0-9\-]+\.[a-z0-9]+([\.a-z0-9]+)?))\b/g; пък гърми с грешка по време на изпълнение.

На Java и на C# го бях направила с negative lookbehind, който реши проблема, но явно не се поддържа от Java script

String regex = "\\b(?<!\\S)(([a-z0-9\\-\\.]+@[a-z0-9\\-]+\\.[a-z]+([\\.a-z]+)?))\\b";

Някакви идеи за корекция?

 

 

 

Тагове:
kristina111 avatar kristina111 58 Точки
Best Answer

Промених малко твоя патърн. Идеята е с non-capturing group да провериш, дали имейлът започва с интервал или е начало на нов стринг. Само че после трябва да тримнеш, защото хваща интервала и го връща в мач-а.

А след @ може да има поне една точка, след която задължително трябва да има валиден текст. Затова малко съкратих твоя патърн като му казвам да хваща символа точка, само ако след него има текст.

Edit: също преди да принтираш, трябва да имаш проверка - (от твоя код) matches!=null  - ако е различно - принтираш. Ето кода: http://pastebin.com/vDVTz8nS . Променливата match не ти е нужна, затова я закоментирах.

това е патърна:   /(?:^| )([a-z][a-z0-9\-\._]+@[a-z0-9\-]+(\.[a-z0-9\-]+){1,})/g

Наистина JavaScript няма positive lookbehind, но интересно за мен беше, че regex101 генерира патърн за Javascript именно с него (вярно, че така го бях написала, но можеше поне да измрънка нещо :) ) в резултат на което падна чуденка защо ми гърми.

1
31/10/2016 12:38:21
Maria_ls avatar Maria_ls 383 Точки

Ей, благодаря много! А match ми е останало от когато се опитах да използвам показаното в презентацията, и изобщо не съм се сетила да го махна smiley

0