Регулярний вираз, який відповідає шаблону або є порожнім рядком


84

У мене є такий регулярний вираз, який відповідає формату адреси електронної пошти:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$

Це використовується для перевірки з формою за допомогою JavaScript. Однак це необов’язкове поле. Тож як я можу змінити цей регулярний вираз відповідно до формату адреси електронної пошти або порожнього рядка?

З моїх обмежених знань регулярних виразів, я думаю, \bвідповідає порожньому рядку і |означає "Або", тому я намагався зробити наступне, але це не спрацювало:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$|\b

5
Якщо вам потрібно перевірити електронну пошту, будьте максимально дозвільними. Ви здивуєтесь, як легко пропустити реальні, дійсні та функціональні адреси електронної пошти за допомогою домашніх регулярних виразів. Наприклад, ваш регулярний вираз зазнає помилок за цими дійсними адресами: joe_blow@foo.com, micro$oft@apple.com, root @ localhost, siegfried+roy@lasvegas.com.
Зано

Погоджуючись із Зано, просто погляньте на цей регулярний вираз ex-parrot.com/pdw/Mail-RFC822-Address.html
Андерс

@Anders Wow, це дуже складний регулярний вираз! Я думаю, я недооцінив складність регулярного виразу
Курт

4
Ні, я думаю, ви недооцінили складність перевірки електронної пошти :-)
Зано

Відповіді:


199

Для відповідності patternабо порожнього рядка використовуйте

^$|pattern

Пояснення

  • ^і $є початком і кінцем прив'язок рядків відповідно.
  • |використовується для позначення заступників, напр this|that.

Список літератури


Увімкнено \b

\bу більшості ароматів є якір "межі слова". Це збіг нульової ширини, тобто порожній рядок, але він збігається лише з цими рядками у дуже конкретних місцях , а саме на межі слова.

Тобто \bзнаходиться:

  • Між послідовними \wта \W(будь-яким замовленням):
    • тобто між символом слова та символом, що не є словом
  • Між ^і\w
    • тобто на початку рядка, якщо він починається з \w
  • Між \wі$
    • тобто в кінці рядка, якщо він закінчується на \w

Список літератури


Про використання регулярного виразу для відповідності адрес електронної пошти

Це не тривіально залежно від специфікації.

Пов’язані запитання


10

Альтернативою може бути розміщення вашого регулярного виразу в дужках, що не фіксують. Потім зробіть цей вираз необов’язковим, використовуючи ?кваліфікатор, який буде шукати 0 (тобто порожній рядок) або 1 екземпляри незахопленої групи.

Наприклад:

/(?: some regexp )?/

У вашому випадку регулярний вираз буде виглядати приблизно так:

/^(?:[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+)?$/

Не |потрібен оператор "або"!

Ось документація Mozilla для синтаксису регулярного виразу JavaScript.


8

Я не впевнений, чому ви хочете перевірити необов’язкову адресу електронної пошти, але я пропоную вам використовувати

^$|^[^@\s]+@[^@\s]+$

значення

^$        empty string
|         or
^         beginning of string
[^@\s]+   any character but @ or whitespace
@         
[^@\s]+
$         end of string

Ви все одно не зупините підроблені електронні листи, і таким чином ви не зупините дійсних адрес.


Якщо в поле не вводиться адреса, в базу даних вводиться значення NULL, тому з цим можна вирішити питання щодо розсилки бюлетенів тощо. Я розумію, що це не зупинить підроблені адреси, і я не думаю, що це взагалі можливо з регулярним виразом, але це, принаймні, мінімізує людські помилки
Курт

1
У мене також клієнти часто просять це. Це насправді просто для того, щоб заважати клієнтам робити щось дурне, наприклад, вводити свій номер телефону в поле електронної пошти.
Келлі Гендрон

Просто хотів перевірити наявність порожнього рядка. ^ $ спрацював
Субхасі

1

\ b відповідає межі слова. Я думаю, ви можете використовувати ^ $ для порожнього рядка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.