Html đối sánh regex

Đến đây, chúng ta đã học về ký tự chữ, lớp ký tự và dấu chấm. Đặt một trong số này vào biểu thức chính quy sẽ báo cho công cụ biểu thức chính quy cố gắng khớp một ký tự

Neo là một giống khác. Chúng không khớp với bất kỳ ký tự nào cả. Thay vào đó, chúng khớp với một vị trí trước, sau hoặc giữa các ký tự. Chúng có thể được sử dụng để “neo” khớp regex tại một vị trí nhất định. Dấu mũ ^ khớp với vị trí trước ký tự đầu tiên trong chuỗi. Áp dụng ^a cho abc khớp với a. ^b hoàn toàn không khớp với abc, vì b không thể khớp ngay sau khi bắt đầu chuỗi, được khớp bởi ^. Xem bên dưới để xem bên trong của công cụ regex

Tương tự, $ khớp ngay sau ký tự cuối cùng trong chuỗi. c$ khớp với c trong abc, trong khi a$ hoàn toàn không khớp

Biểu thức chính quy chỉ bao gồm một ký tự neo chỉ có thể tìm thấy các kết quả khớp có độ dài bằng 0. Điều này có thể hữu ích, nhưng cũng có thể tạo ra sự phức tạp được giải thích ở phần cuối của hướng dẫn này

Ứng dụng hữu ích

Khi sử dụng các biểu thức chính quy trong ngôn ngữ lập trình để xác thực đầu vào của người dùng, việc sử dụng các ký tự neo là rất quan trọng. Nếu bạn sử dụng mã if ($input =~ m/\d+/) trong tập lệnh Perl để xem liệu người dùng có nhập một số nguyên hay không, thì nó sẽ chấp nhận đầu vào ngay cả khi người dùng nhập qsdf4ghjk, vì \d+ khớp với 4. Regex chính xác để sử dụng là ^\d+$. Bởi vì "bắt đầu chuỗi" phải được khớp trước khi khớp \d+ và "cuối chuỗi" phải được khớp ngay sau nó, nên toàn bộ chuỗi phải bao gồm các chữ số để ^\d+$ có thể khớp

Người dùng rất dễ vô tình gõ vào khoảng trắng. Khi Perl đọc một dòng từ tệp văn bản, ngắt dòng cũng được lưu trong biến. Vì vậy, trước khi xác thực đầu vào, bạn nên cắt bớt khoảng trắng ở đầu và cuối. ^\s+ khớp với khoảng trắng ở đầu và \s+$ khớp với khoảng trắng ở cuối. Trong Perl, bạn có thể sử dụng $input =~ s/^\s+. \s+$//g. Việc sử dụng xen kẽ tiện dụng và /g cho phép chúng tôi thực hiện việc này trong một dòng mã

Sử dụng ^ và $ làm Điểm neo đầu dòng và cuối dòng

Nếu bạn có một chuỗi bao gồm nhiều dòng, chẳng hạn như dòng đầu tiên\ndòng thứ hai (trong đó \n biểu thị ngắt dòng), bạn nên làm việc với các dòng thay vì toàn bộ chuỗi. Do đó, hầu hết các công cụ regex được thảo luận trong hướng dẫn này đều có tùy chọn để mở rộng ý nghĩa của cả hai ký tự neo. ^ sau đó có thể khớp ở đầu chuỗi (trước f trong chuỗi trên), cũng như sau mỗi lần ngắt dòng (giữa \n và s). Tương tự như vậy, $ vẫn khớp ở cuối chuỗi (sau chữ e cuối cùng) và cả trước mỗi lần ngắt dòng (giữa e và \n)

Trong các trình soạn thảo văn bản như EditPad Pro hoặc GNU Emacs và các công cụ regex như PowerGREP, dấu mũ và đô la luôn khớp nhau ở đầu và cuối mỗi dòng. Điều này hợp lý vì các ứng dụng đó được thiết kế để hoạt động với toàn bộ tệp chứ không phải các chuỗi ngắn. Trong Ruby và tiêu chuẩn. regex dấu mũ và đô la cũng luôn khớp ở đầu và cuối mỗi dòng. Trong Boost, chúng khớp ở đầu và cuối mỗi dòng theo mặc định. Boost cho phép bạn tắt tính năng này bằng regex_constants. no_mod_m khi sử dụng ngữ pháp ECMAScript

Trong tất cả các ngôn ngữ lập trình và thư viện khác được thảo luận trên trang web này, bạn phải kích hoạt chức năng mở rộng này một cách rõ ràng. Theo truyền thống, nó được gọi là “chế độ nhiều dòng”. Trong Perl, bạn làm điều này bằng cách thêm m sau mã regex, như thế này. m/^regex$/m;. Trong. NET, các neo khớp trước và sau các dòng mới khi bạn chỉ định RegexOptions. Đa dòng, chẳng hạn như trong Regex. Match("chuỗi", "regex", RegexOptions. nhiều dòng)

Ký tự ngắt dòng

Trang hướng dẫn về dấu chấm đã thảo luận về ký tự nào được coi là ký tự ngắt dòng theo các hương vị biểu thức chính quy khác nhau. Điều này ảnh hưởng nhiều đến các neo khi ở chế độ nhiều dòng và khi đồng đô la khớp trước khi kết thúc đợt phá vỡ cuối cùng. Các neo xử lý các ngắt dòng bao gồm một ký tự giống như dấu chấm trong mỗi hương vị biểu thức chính quy

Đối với các ký tự neo, có một sự cân nhắc bổ sung khi CR và LF xuất hiện dưới dạng một cặp và hương vị biểu thức chính quy coi cả hai ký tự này là ngắt dòng. Delphi, Java và hương vị JGsoft coi CRLF là một cặp không thể chia cắt. ^ khớp sau CRLF và $ khớp trước CRLF, nhưng không khớp ở giữa cặp CRLF. JavaScript và XPath coi các cặp CRLF là hai ngắt dòng. ^ khớp ở giữa và sau CRLF, trong khi $ khớp trước và ở giữa CRLF

Điểm bắt đầu vĩnh viễn của chuỗi và điểm cuối của chuỗi

\A chỉ khớp ở đầu chuỗi. Tương tự như vậy, \Z chỉ khớp ở cuối chuỗi. Hai mã thông báo này không bao giờ khớp nhau khi ngắt dòng. Điều này đúng với tất cả các hương vị regex được thảo luận trong hướng dẫn này, ngay cả khi bạn bật “chế độ nhiều dòng”. Trong EditPad Pro và PowerGREP, trong đó dấu mũ và đô la luôn khớp ở đầu và cuối dòng, \A và \Z chỉ khớp ở đầu và cuối của toàn bộ tệp

JavaScript, POSIX, XML và XPath không hỗ trợ \A và \Z. Bạn gặp khó khăn với việc sử dụng dấu mũ và đô la cho mục đích này

Các phần mở rộng GNU cho các biểu thức chính quy POSIX sử dụng \` (dấu lùi) để khớp với phần đầu của chuỗi và \' (dấu nháy đơn) để khớp với phần cuối của chuỗi

Các chuỗi kết thúc bằng ngắt dòng

Bởi vì Perl trả về một chuỗi có một dòng mới ở cuối khi đọc một dòng từ một tệp, công cụ biểu thức chính của Perl khớp với $ ở vị trí trước khi ngắt dòng ở cuối chuỗi ngay cả khi chế độ nhiều dòng bị tắt. Perl cũng khớp với $ ở cuối chuỗi, bất kể ký tự đó có phải là ngắt dòng hay không. Vì vậy, ^\d+$ khớp với 123 cho dù chuỗi chủ đề là 123 hay 123\n

Hầu hết các hương vị regex hiện đại đã sao chép hành vi này. Điều đó bao gồm. NET, Java, PCRE, Delphi, PHP và Python. Hành vi này không phụ thuộc vào bất kỳ cài đặt nào, chẳng hạn như “chế độ nhiều dòng”

Trong tất cả các hương vị này ngoại trừ Python, \Z cũng khớp trước dấu ngắt dòng cuối cùng. Nếu bạn chỉ muốn khớp ở cuối tuyệt đối của chuỗi, hãy sử dụng \z (chữ thường z thay vì chữ hoa Z). \A\d+\z không khớp với 123\n. \z khớp sau dấu ngắt dòng, không khớp với lớp ký tự tốc ký

Trong Python, \Z chỉ khớp ở cuối chuỗi. Python không hỗ trợ \z

Các chuỗi kết thúc bằng nhiều ngắt dòng

Nếu một chuỗi kết thúc bằng nhiều lần ngắt dòng và chế độ nhiều dòng bị tắt thì $ chỉ khớp trước lần ngắt dòng cuối cùng ở tất cả các điểm mà nó có thể khớp trước lần ngắt cuối cùng. Điều này cũng đúng với \Z bất kể chế độ nhiều dòng

Boost là ngoại lệ duy nhất. Trong Boost, \Z có thể khớp trước bất kỳ số lần ngắt dòng nào cũng như ở cuối chuỗi. Vì vậy, nếu chuỗi chủ đề kết thúc bằng ba lần ngắt dòng, thì \Z của Boost có bốn vị trí mà nó có thể khớp tại. Giống như tất cả các hương vị khác, \Z của Boost không phụ thuộc vào chế độ nhiều dòng. $ của Boost chỉ khớp ở cuối chuỗi khi bạn tắt chế độ nhiều dòng (được bật theo mặc định trong Boost)

Nhìn vào bên trong Công cụ Regex

Hãy xem điều gì sẽ xảy ra khi chúng ta cố khớp ^4$ với 749\n486\n4 (trong đó \n đại diện cho một ký tự xuống dòng) ở chế độ nhiều dòng. Như thường lệ, công cụ regex bắt đầu ở ký tự đầu tiên. 7. Mã thông báo đầu tiên trong biểu thức chính quy là ^. Vì mã thông báo này là mã thông báo có độ dài bằng 0, nên công cụ không cố khớp mã thông báo đó với ký tự mà thay vào đó là với vị trí trước ký tự mà công cụ biểu thức chính quy đã đạt được cho đến nay. ^ thực sự phù hợp với vị trí trước 7. Sau đó, công cụ chuyển sang mã thông báo regex tiếp theo. 4. Vì mã thông báo trước đó có độ dài bằng 0, công cụ biểu thức chính quy không chuyển sang ký tự tiếp theo trong chuỗi. Nó vẫn ở mức 7. 4 là một ký tự chữ, không khớp với 7. Không có hoán vị nào khác của biểu thức chính quy, vì vậy công cụ bắt đầu lại với mã thông báo biểu thức chính quy đầu tiên, ở ký tự tiếp theo. 4. Lần này, ^ không thể khớp ở vị trí trước 4. Vị trí này đứng trước một ký tự và ký tự đó không phải là một dòng mới. Động cơ tiếp tục ở mức 9 và lại thất bại. Lần thử tiếp theo, tại \n, cũng thất bại. Một lần nữa, vị trí trước \n được bắt đầu bởi một ký tự, 9 và ký tự đó không phải là một dòng mới

Sau đó, công cụ regex đến vị trí thứ 4 trong chuỗi. ^ có thể khớp ở vị trí trước số 4, vì nó đứng trước ký tự xuống dòng. Một lần nữa, công cụ biểu thức chính quy tiến tới mã thông báo biểu thức chính quy tiếp theo, 4, nhưng không tiến tới vị trí ký tự trong chuỗi. 4 khớp với 4 và công cụ tăng cả mã thông báo biểu thức chính quy và ký tự chuỗi. Bây giờ công cụ cố gắng khớp với $ ở vị trí trước đó (thực sự. trước) số 8. Đồng đô la không thể khớp ở đây, vì vị trí này được theo sau bởi một ký tự và ký tự đó không phải là một dòng mới

Tuy nhiên, một lần nữa, công cụ phải cố gắng khớp lại mã thông báo đầu tiên. Trước đó, nó đã được khớp thành công ở ký tự thứ 4 thứ hai, vì vậy động cơ tiếp tục ở ký tự tiếp theo, 8, trong đó dấu mũ không khớp. Tương tự ở số 6 và dòng mới

Cuối cùng, công cụ biểu thức chính quy cố gắng khớp mã thông báo đầu tiên ở vị trí thứ 4 thứ ba trong chuỗi. Với thành công. Sau đó, động cơ khớp thành công 4 với 4. Mã thông báo biểu thức chính quy hiện tại được nâng cao thành $ và ký tự hiện tại được nâng cao lên vị trí cuối cùng trong chuỗi. khoảng trống sau chuỗi. Không có mã thông báo regex nào cần một ký tự khớp có thể khớp ở đây. Thậm chí không phải là một lớp ký tự phủ định. Tuy nhiên, chúng tôi đang cố gắng khớp một ký hiệu đô la và đồng đô la mạnh mẽ là một con thú kỳ lạ. Nó có độ dài bằng 0, vì vậy nó cố khớp với vị trí trước ký tự hiện tại. Việc “ký tự” này là khoảng trống sau chuỗi không thành vấn đề. Trên thực tế, đồng đô la kiểm tra ký tự hiện tại. Nó phải là một dòng mới hoặc khoảng trống sau chuỗi để $ khớp với vị trí trước ký tự hiện tại. Vì đó là trường hợp sau ví dụ, đồng đô la khớp thành công

Vì $ là mã thông báo cuối cùng trong biểu thức chính quy, công cụ đã tìm thấy kết quả khớp thành công. 4 cuối cùng trong chuỗi