Lời khuyên của nhóm bạn gần như đúng, ngoại trừ lỗi đã mắc phải. Một khi bạn tìm ra lý do tại sao, bạn sẽ không bao giờ quên nó. Hãy xem sai lầm này.
/^(7|8|9)\d{9}$/
Điều này làm gì:
^
và $
biểu thị các kết quả phù hợp được cố định, điều này khẳng định rằng chất phụ ở giữa các điểm neo này là toàn bộ kết quả phù hợp. Chuỗi sẽ chỉ khớp nếu chất con phù hợp với toàn bộ chuỗi, không chỉ một phần.
()
biểu thị một nhóm bắt .
7|8|9
biểu thị phù hợp với một trong hai 7
, 8
hoặc 9
. Nó thực hiện điều này với sự luân phiên , đó là những gì người vận hành đường ống |
làm - luân phiên giữa các lần thay đổi. Điều này cản trở giữa các lần thay đổi: Nếu lần thay thế đầu tiên không được khớp, động cơ phải quay lại trước khi vị trí con trỏ di chuyển trong khi khớp của lần thay thế, để tiếp tục khớp với lần thay thế tiếp theo; Trong khi lớp nhân vật có thể thăng tiến tuần tự. Xem kết quả phù hợp này trên công cụ regex đã tắt tối ưu hóa:
Pattern: (r|f)at
Match string: carat

Pattern: [rf]at
Match string: carat

\d{9}
khớp với chín chữ số. \d
là một siêu ký tự viết tắt, khớp với bất kỳ chữ số nào.
/^[7|8|9][\d]{9}$/
Nhìn vào những gì nó làm:
^
và cũng $
biểu thị các kết quả phù hợp.
[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 9
có 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 có backtracking.
[\d]
là một lớp nhân vật sống trong siêu ký tự \d
. Nhân tiện, việc kết hợp sử dụng một lớp ký tự và một siêu ký tự là một ý tưởng tồi, vì lớp trừu tượng có thể làm chậm quá trình khớp, nhưng đây chỉ là chi tiết triển khai và chỉ áp dụng cho một số triển khai regex. JavaScript không phải là một, nhưng nó làm cho subpattern dài hơn một chút.
{9}
cho biết cấu trúc đơn trước đó được lặp lại tổng cộng chín lần.
Regex tối ưu là /^[789]\d{9}$/
, bởi vì việc /^(7|8|9)\d{9}$/
thu thập không cần thiết dẫn đến giảm hiệu suất trên hầu hết các triển khai regex (javascripttình cờ là một, xem xét câu hỏi sử dụng từ khóa var
trong mã, đây có thể là JavaScript). Việc sử dụngphpchạy trên PCRE để đối sánh thai sẽ tối ưu hóa việc thiếu backtracking, tuy nhiên chúng tôi cũng không sử dụng PHP, vì vậy việc 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 việc sử dụng biểu thức chính quy trước đó.
(7|8|9)
và[789]
không tương đương, bởi vì cái đầu tiên là chụp, 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 ...).