Biểu thức chính quy khớp với một mẫu hoặc là một chuỗi trống


84

Tôi có Cụm từ Thông dụng sau phù hợp với định dạng địa chỉ email:

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

Điều này được sử dụng để xác nhận với một biểu mẫu sử dụng JavaScript. Tuy nhiên, đây là trường tùy chọn. Do đó, làm cách nào để thay đổi regex này để khớp với định dạng địa chỉ email hoặc một chuỗi trống?

Từ kiến ​​thức regex hạn chế của mình, tôi nghĩ rằng \bkhớp với một chuỗi trống và |có nghĩa là "Hoặc", vì vậy tôi đã cố gắng thực hiện như sau, nhưng nó không hoạt động:

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

5
Nếu bạn phải xác thực email, hãy càng dễ dãi càng tốt. Bạn sẽ ngạc nhiên rằng việc bỏ lỡ các địa chỉ email thực, hợp lệ và hoạt động dễ dàng như thế nào với regexes tự làm. Ví dụ: regex của bạn sẽ không thành công trên các địa chỉ hợp lệ sau: joe_blow@foo.com, micro$oft@apple.com, root @ localhost, siegfried+roy@lasvegas.com.
Zano

Đồng ý với Zano, chỉ cần xem qua regex ex-parrot.com/pdw/Mail-RFC822-Address.html
Anders,

@Anders wow, đó là một regex rất phức tạp! Tôi nghĩ rằng tôi đã misunderestimated sự phức tạp của regex
Curt

4
Không, tôi nghĩ bạn đã misunderestimated sự phức tạp của việc xác nhận email :-)
Zano

Câu trả lời:


199

Để khớp patternhoặc một chuỗi trống, hãy sử dụng

^$|pattern

Giải trình

  • ^và lần lượt $là đầu và cuối của chuỗi neo.
  • |được sử dụng để biểu thị các thay thế, ví dụ this|that.

Người giới thiệu


Trên \b

\btrong hầu hết các hương vị là một "ranh giới từ" neo. Nó là một đối sánh không có độ rộng, tức là một chuỗi trống, nhưng nó chỉ khớp với những chuỗi đó ở những vị trí rất cụ thể , cụ thể là ở các ranh giới của một từ.

Đó là, \bnằm ở:

  • Giữa liên tiếp \w\W(một trong hai thứ tự):
    • tức là giữa một ký tự từ và một ký tự không phải từ
  • Giữa ^\w
    • tức là ở đầu chuỗi nếu nó bắt đầu bằng \w
  • Giữa \w$
    • tức là ở cuối chuỗi nếu nó kết thúc bằng \w

Người giới thiệu


Khi sử dụng regex để khớp với địa chỉ e-mail

Điều này không phải là tầm thường tùy thuộc vào đặc điểm kỹ thuật.

Câu hỏi liên quan


10

Một giải pháp thay thế sẽ là đặt regexp của bạn trong các dấu ngoặc đơn không bắt. Sau đó, làm cho biểu thức đó là tùy chọn bằng cách sử dụng bộ định tính ?, bộ định lượng này sẽ tìm kiếm 0 (tức là chuỗi trống) hoặc 1 phiên bản của nhóm không được bắt.

Ví dụ:

/(?: some regexp )?/

Trong trường hợp của bạn, biểu thức chính quy sẽ trông giống như sau:

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

Không |cần toán tử "hoặc"!

Đây là tài liệu Mozilla về cú pháp Biểu thức chính quy JavaScript.


8

Tôi không chắc tại sao bạn muốn xác thực một địa chỉ email tùy chọn, nhưng tôi khuyên bạn nên sử dụng

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

Ý nghĩa

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

Dù sao thì bạn cũng sẽ không chặn được email giả và bằng cách này, bạn sẽ không chặn được các địa chỉ hợp lệ.


Nếu một địa chỉ không được nhập vào trường, giá trị NULL sẽ được nhập vào cơ sở dữ liệu, do đó, điều này có thể được xử lý khi nói đến việc gửi bản tin, v.v. Tôi đánh giá cao điều này sẽ không ngăn chặn các địa chỉ giả mạo và tôi không nghĩ rằng thats thể ở tất cả với Regex, nhưng nó sẽ ít nhất là giảm thiểu con người lỗi
Curt

1
Tôi cũng có khách hàng yêu cầu điều này thường xuyên. Nó thực sự chỉ để giữ cho khách hàng không làm điều gì đó ngu ngốc như nhập số điện thoại của họ vào trường email.
Kelly Gendron

Chỉ muốn kiểm tra một Chuỗi trống. ^ $ đã làm việc
Subhashi

1

\ b khớp với một ranh giới từ. Tôi nghĩ bạn có thể sử dụng ^ $ cho chuỗi trống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.