82

Đây là một biểu thức chính quy tôi đã tạo để sử dụng trong JavaScript:

var reg_num = /^(7|8|9)\d{9}$/

Đây là một cái khác được đề xuất bởi thành viên trong nhóm của tôi.

var reg_num = /^[7|8|9][\d]{9}$/

Quy tắc là xác thực số điện thoại:

  • Nó chỉ nên có mười số.
  • Số đầu tiên được cho là bất kỳ số 7, 8 hoặc 9.
|
102

Các biểu thức này là tương đương (cho mục đích phù hợp):

  • /^(7|8|9)\d{9}$/
  • /^[789]\d{9}$/
  • /^[7-9]\d{9}$/

Giải thích:

  • (a|b|c)là một biểu thức chính "HOẶC" và có nghĩa là "a hoặc b hoặc c", mặc dù sự hiện diện của dấu ngoặc, cần thiết cho OR, cũng ghi lại chữ số. Để hoàn toàn tương đương, bạn sẽ mã hóa (?:7|8|9)để biến nó thành một nhóm không bắt giữ.

  • [abc]là một "lớp nhân vật" có nghĩa là "bất kỳ ký tự nào từ a, b hoặc c" (một lớp ký tự có thể sử dụng phạm vi, ví dụ [a-d]= [abcd])

Lý do các biểu thức này giống nhau là vì một lớp ký tự là một tốc ký cho một "hoặc" (nhưng chỉ cho các ký tự đơn). Trong một thay thế, bạn cũng có thể làm một cái gì đó (abc|def)mà không dịch sang một lớp nhân vật.

|
  • 1

    (7|8|9)[789]không tương đương, bởi vì cái đầu tiên là bắt giữ, cái sau thì không. (?:7|8|9)mặt khác sẽ tương đương (tôi đoán bạn biết điều đó tất nhiên ...).

    – Huỳnh Ðức Khiêm 09:55:28 21/03/2012
  • 1

    Tôi đang xem regex này : [<<|>>|\]\]|\[\[]. Do bối cảnh, tôi biết rằng regex đang cố gắng để phù hợp <<hoặc >>hoặc [[hoặc ]]. Nhưng từ những gì bạn đã nói, nó phải được phù hợp <hoặc >hoặc [hoặc ]. Nếu bạn sử dụng |giữa [], dấu ngoặc có hành xử khác nhau không?

    – Trịnh Như Hoa 20:39:29 14/11/2017
  • 1

    @DanielKaplan không sử dụng |trong một lớp nhân vật [...], trừ khi bạn muốn khớp chính ký tự ống đó. Ngoài ra, việc sao chép các ký tự trong một lớp ký tự không có tác dụng - một lớp ký tự là một danh sách các ký tự và sẽ khớp chính xác với một trong số chúng. Tôi đoán là bạn muốn có một nhóm , sử dụng dấu ngoặc tròn bình thường:(<<|>>|\]\]|\[\[)

    – Trịnh Uyên Nhi 21:35:43 14/11/2017
52

Lời khuyên của nhóm bạn là gần như đúng, ngoại trừ sai lầm mà anh ấy đã gây ra. Một khi bạn tìm hiểu tại sao, bạn sẽ không bao giờ quên nó. Hãy nhìn vào sai lầm này.

/^(7|8|9)\d{9}$/

Cái này làm gì

  • ^$biểu thị các trận đấu neo, trong đó khẳng định rằng mô hình con ở giữa các neo này là toàn bộ trận đấu. Chuỗi sẽ chỉ khớp nếu mô hình con khớp với toàn bộ chuỗi, không chỉ là một phần.
  • ()biểu thị một nhóm bắt giữ .
  • 7|8|9biểu thị phù hợp với một trong hai 7, 8hoặc 9. Nó thực hiện điều này với các xen kẽ , đó là những gì người vận hành đường ống |làm - xen kẽ giữa các lần xen kẽ. Sự quay lại này giữa các lần xen kẽ: Nếu sự thay thế đầu tiên không khớp, động cơ phải quay trở lại trước khi vị trí con trỏ di chuyển trong trận đấu của sự thay thế, để tiếp tục khớp lần lượt tiếp theo; Trong khi đó lớp nhân vật có thể tiến lên tuần tự. Xem trận đấu này trên công cụ regex với tối ưu hóa bị vô hiệu hóa:
Pattern: (r|f)at
Match string: carat

Pattern: [rf]at
Match string: carat

  • \d{9}khớp chín chữ số. \dlà một metacharacter tốc ký, phù hợp với bất kỳ chữ số.
/^[7|8|9][\d]{9}$/

Nhìn vào những gì nó làm:

  • ^$biểu thị các trận đấu neo là tốt.
  • [7|8|9]là một lớp nhân vật . Bất kỳ ký tự từ danh sách 7, |, 8, |, hoặc 9có thể được xuất hiện, do đó |đã được bổ sung vào không chính xác. Điều này phù hợp mà không quay trở lại.
  • [\d]là một lớp nhân vật cư trú của metacharacter \d. Nhân tiện, việc kết hợp sử dụng một lớp nhân vật và một metacharacter duy nhất là một ý tưởng tồi, vì lớp trừu tượng có thể làm chậm trận đấu, nhưng đây chỉ là một chi tiết triển khai và chỉ áp dụng cho một vài triển khai regex. JavaScript không phải là một, nhưng nó làm cho mô hình con dài hơn một chút.
  • {9} chỉ ra cấu trúc đơn trước đó được lặp lại chín lần trong tổng số.

Regex tối ưu là /^[789]\d{9}$/bởi vì /^(7|8|9)\d{9}$/nắm bắt một cách không cần thiết làm giảm hiệu suất trên hầu hết các triển khai regex ( xảy ra là một, xem xét câu hỏi sử dụng từ khóa vartrong mã, đây có thể là JavaScript). Việc sử dụng chạy trên PCRE cho kết hợp preg sẽ tối ưu hóa việc thiếu quay lại, tuy nhiên chúng tôi cũng không sử dụng PHP, vì vậy sử dụng các lớp []thay vì thay thế |sẽ mang lại phần thưởng hiệu suất vì trận đấu không quay lại và do đó cả hai đều khớp và thất bại nhanh hơn so với sử dụng biểu thức chính quy trước đó của bạn.

|
11

2 ví dụ đầu tiên hành động rất khác nhau nếu bạn thay thế chúng bằng một cái gì đó. Nếu bạn phù hợp với điều này:

str = str.replace(/^(7|8|9)/ig,''); 

bạn sẽ thay thế 7 hoặc 8 hoặc 9 bằng chuỗi trống.

Nếu bạn phù hợp với điều này

str = str.replace(/^[7|8|9]/ig,''); 

bạn sẽ thay thế 7hoặc 8hoặc 9OR thanh dọc !!!! bởi chuỗi rỗng.

Tôi chỉ tìm thấy điều này một cách khó khăn.

|
  • 1

    Chào mừng đến với SO! Thay thế hoặc phù hợp, đó chỉ là sai. Rất nhiều người mắc lỗi đó và đôi khi họ thường tránh xa nó - đôi khi, trong nhiều năm - bởi vì chuỗi đầu vào của họ không bao giờ xảy ra để chứa một đường ống ( |).

    – Hoàng Công Giang 19:15:22 20/06/2013

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.