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ì
^
và $
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|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 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ố. \d
là 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:
^
và $
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 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 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 ( javascript xảy ra 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ụng php 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.
– Huỳnh Ðức Khiêm 09:55:28 21/03/2012(7|8|9)
và[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 ...).Tôi đang xem regex này :
– Trịnh Như Hoa 20:39:29 14/11/2017[<<|>>|\]\]|\[\[]
. 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?@DanielKaplan không sử dụng
– Trịnh Uyên Nhi 21:35:43 14/11/2017|
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:(<<|>>|\]\]|\[\[)