Làm cách nào để xóa ký tự theo sau trong Perl?
Nếu bạn chưa từng sử dụng biểu thức chính quy trước đây, phần giới thiệu hướng dẫn có sẵn trong perlretut. Nếu bạn chỉ biết một chút về họ, phần giới thiệu bắt đầu nhanh có sẵn trong perlrequick Show
Ngoại trừ phần "Khái niệm cơ bản", trang này giả định rằng bạn đã quen thuộc với kiến thức cơ bản về biểu thức chính quy, chẳng hạn như "mẫu" là gì, nó trông như thế nào và về cơ bản nó được sử dụng như thế nào. Để tham khảo về cách chúng được sử dụng, cùng với nhiều ví dụ giống nhau, hãy xem các cuộc thảo luận về ________ 045, ________ 046, ________ 047 và ________ 048 trong "Regexp Quote-Like Operator" trong perlop Mới trong v5. 22, 49 áp dụng các quy tắc chặt chẽ hơn so với các quy tắc khác khi biên dịch các mẫu biểu thức chính quy. Nó có thể tìm thấy những thứ, trong khi hợp pháp, có thể không phải là những gì bạn dự định#Những thứ cơ bảnBiểu thức chính quy là các chuỗi có cú pháp và ý nghĩa rất cụ thể được mô tả trong tài liệu này và các tài liệu phụ trợ được đề cập bởi tài liệu này. Các chuỗi được gọi là "mẫu". Các mẫu được sử dụng để xác định xem một số chuỗi khác, được gọi là "mục tiêu", có (hoặc không có) các đặc điểm được chỉ định bởi mẫu. Chúng tôi gọi đây là "so khớp" chuỗi mục tiêu với mẫu. Thông thường, khớp được thực hiện bằng cách đặt mục tiêu là toán hạng đầu tiên và mẫu là toán hạng thứ hai, của một trong hai toán tử nhị phân 50 và 51, được liệt kê trong "Toán tử liên kết" trong perlop;
Điều này được đánh giá là đúng khi và chỉ khi chuỗi trong biến 52 chứa ở đâu đó trong chuỗi ký tự "a", "b", rồi "c". (_______053, hoặc toán tử so khớp, được mô tả trong "m/PATTERN/msixpodualngc" trong perlop. )Các mẫu chưa được lưu trữ trong một số biến phải được phân tách ở cả hai đầu bằng các ký tự phân cách. Như trong ví dụ trên, đây thường là các dấu gạch chéo về phía trước và cách điển hình mà một mẫu được viết trong tài liệu là với các dấu gạch chéo đó. Trong hầu hết các trường hợp, dấu phân cách là cùng một ký tự, phía trước và phía sau, nhưng có một vài trường hợp một ký tự trông giống như nó có một hình ảnh phản chiếu, trong đó phiên bản mở đầu là dấu phân cách bắt đầu và phiên bản kết thúc là kết thúc
Hầu hết, mẫu được đánh giá trong ngữ cảnh dấu ngoặc kép, nhưng có thể chọn dấu phân cách để buộc dấu ngoặc đơn, chẳng hạn như 1Nếu mẫu chứa dấu phân cách bên trong nó, thì dấu phân cách đó phải được thoát. Tiền tố nó với một dấu gạch chéo ngược (e. g. , 54) phục vụ mục đích nàyBất kỳ ký tự đơn nào trong một mẫu đều khớp với ký tự đó trong chuỗi đích, trừ khi ký tự đó là siêu ký tự có ý nghĩa đặc biệt được mô tả trong tài liệu này. Một chuỗi các ký tự không phải siêu ký tự khớp với cùng một chuỗi trong chuỗi đích, như chúng ta đã thấy ở trên với 55Chỉ một vài ký tự (tất cả đều là ký tự dấu chấm câu ASCII) là siêu ký tự. Loại được sử dụng phổ biến nhất là dấu chấm 56, thường khớp với hầu hết mọi ký tự (kể cả chính dấu chấm)Bạn có thể khiến các ký tự thường hoạt động như siêu ký tự được diễn giải theo nghĩa đen bằng cách đặt trước chúng một số 57, giống như dấu phân cách của mẫu phải được thoát ra nếu nó cũng xuất hiện trong mẫu. Do đó, 58 chỉ khớp với một dấu chấm theo nghĩa đen, 56 thay vì nghĩa thông thường của nó. Điều này có nghĩa là dấu gạch chéo ngược cũng là một siêu ký tự, do đó, 60 khớp với một 57. Và một chuỗi chứa một siêu ký tự đã thoát khớp với cùng một chuỗi (nhưng không có ký tự thoát) trong chuỗi đích. Vì vậy, mẫu 62 sẽ khớp với bất kỳ chuỗi mục tiêu nào chứa chuỗi 63Siêu ký tự 64 được sử dụng để khớp với thứ này hay thứ khác. Như vậy 3là TRUE khi và chỉ khi 52 chứa dãy 66 hoặc dãy 67. Giống như tất cả các siêu ký tự, việc đặt trước 64 một dấu gạch chéo ngược làm cho nó khớp với ký tự dấu chấm câu đơn giản; 8là TRUE khi và chỉ khi 52 chứa chuỗi 70Bạn không bị giới hạn chỉ một 64 2là ĐÚNG khi và chỉ khi 52 chứa bất kỳ chuỗi nào trong số 4 chuỗi đó từ câu chuyện dành cho trẻ em "Jack và cây đậu thần"Như bạn có thể thấy, 64 liên kết ít chặt chẽ hơn một chuỗi các ký tự thông thường. Chúng tôi có thể ghi đè điều này bằng cách sử dụng các siêu ký tự nhóm, dấu ngoặc đơn 74 và 75 7là TRUE khi và chỉ khi 52 chứa dãy 77 hoặc dãy 78. Các phần của chuỗi khớp với các phần của mẫu được đặt trong dấu ngoặc đơn thường được cung cấp riêng để sử dụng sau này trong mẫu, thay thế hoặc chương trình. Điều này được gọi là "chụp" và nó có thể trở nên phức tạp. Xem "Chụp nhóm"Phương án đầu tiên bao gồm mọi thứ từ dấu phân cách mẫu cuối cùng ( 74, 80 (được mô tả sau), v.v. hoặc phần đầu của mẫu) cho đến ________ 064 đầu tiên và phương án cuối cùng chứa mọi thứ từ ________ 064 cuối cùng đến dấu phân cách mẫu đóng tiếp theo. Đó là lý do tại sao thông lệ bao gồm các lựa chọn thay thế trong ngoặc đơn. để giảm thiểu sự nhầm lẫn về nơi chúng bắt đầu và kết thúcCác phương án được thử từ trái sang phải, vì vậy phương án đầu tiên được tìm thấy mà toàn bộ biểu thức khớp với nó là phương án được chọn. Điều này có nghĩa là các lựa chọn thay thế không nhất thiết phải tham lam. Ví dụ. khi khớp 83 với 84, chỉ phần 85 sẽ khớp, vì đó là giải pháp thay thế đầu tiên được thử và nó khớp thành công với chuỗi mục tiêu. (Điều này có vẻ không quan trọng, nhưng điều quan trọng là khi bạn chụp văn bản phù hợp bằng cách sử dụng dấu ngoặc đơn. )Bên cạnh việc loại bỏ ý nghĩa đặc biệt của siêu ký tự, dấu gạch chéo ngược có tiền tố thay đổi một số ký tự chữ cái và chữ số không chỉ khớp với chính chúng để thay vào đó có ý nghĩa đặc biệt. Chúng được gọi là "chuỗi thoát" và tất cả như vậy được mô tả trong perlrebackslash. Chuỗi dấu gạch chéo ngược (của một chữ cái hoặc chữ số) hiện không có ý nghĩa đặc biệt đối với Perl sẽ đưa ra cảnh báo nếu cảnh báo được bật, vì chúng được dành riêng cho mục đích sử dụng trong tương lai Một chuỗi như vậy là 86, khớp với một ranh giới nào đó. 87 và một số người khác đưa ra các loại ranh giới chuyên biệt. (Tất cả chúng đều được mô tả chi tiết bắt đầu từ "\b{}, \b, \B{}, \B" trong perlrebackslash. ) Lưu ý rằng các ký tự này không khớp với nhau, nhưng khoảng cách có độ rộng bằng 0 giữa các ký tự. Chúng là một ví dụ về xác nhận độ rộng bằng không. Xem xét lại, 2Nó đánh giá là TRUE nếu, ngoài 4 từ đó, bất kỳ chuỗi nào trong số các chuỗi "feed", "field", "Defoe", "fume" và nhiều từ khác nằm trong 52. Bằng cách sử dụng hợp lý 86 (hoặc tốt hơn (vì nó được thiết kế để xử lý ngôn ngữ tự nhiên) 87), chúng tôi có thể đảm bảo rằng chỉ những từ của Người khổng lồ mới được khớp 4Ví dụ cuối cùng cho thấy các ký tự 91 và 92 là các siêu ký tựMột cách sử dụng khác cho các chuỗi thoát là chỉ định các ký tự không thể (hoặc bạn không muốn) được viết theo nghĩa đen. Chúng được mô tả chi tiết trong "Nhân vật thoát" trong dấu gạch chéo ngược perl, nhưng ba đoạn tiếp theo mô tả ngắn gọn một số trong số chúng Các ký tự điều khiển khác nhau có thể được viết theo phong cách ngôn ngữ C. 93 khớp với một dòng mới, 94 một tab, 95 một ký tự xuống dòng, 96 một nguồn cấp dữ liệu biểu mẫu, v.v.Tổng quát hơn, 97, trong đó nnn là một chuỗi gồm ba chữ số bát phân, khớp với ký tự có điểm mã gốc là nnn. Bạn có thể dễ dàng gặp rắc rối nếu bạn không có chính xác ba chữ số. Vì vậy, hãy luôn sử dụng ba hoặc kể từ Perl 5. 14, bạn có thể sử dụng 98 để chỉ định bất kỳ số chữ số bát phân nàoTương tự, 99, trong đó nn là các chữ số thập lục phân, khớp với ký tự có thứ tự gốc là nn. Một lần nữa, việc không sử dụng chính xác hai chữ số là một công thức dẫn đến thảm họa, nhưng bạn có thể sử dụng 100 để chỉ định bất kỳ số lượng chữ số hex nàoBên cạnh việc là một siêu ký tự, 56 là một ví dụ về "lớp ký tự", một thứ có thể khớp với bất kỳ ký tự đơn lẻ nào trong một tập hợp nhất định của chúng. Trong trường hợp của nó, tập hợp chỉ là về tất cả các ký tự có thể. Perl định nghĩa trước một số lớp ký tự bên cạnh 56; Bạn có thể xác định các lớp ký tự tùy chỉnh của riêng mình, bằng cách đưa vào mẫu của bạn ở (các) vị trí thích hợp, danh sách tất cả các ký tự bạn muốn trong tập hợp. Bạn thực hiện việc này bằng cách đặt danh sách trong khoảng 103 ký tự ngoặc. Chúng được gọi là "các lớp ký tự được đặt trong ngoặc" khi chúng ta nói chính xác, nhưng thường thì từ "được đặt trong ngoặc" bị bỏ. (Rớt nó thường không gây nhầm lẫn. ) Điều này có nghĩa là ký tự 104 là một siêu ký tự khác. Nó không khớp với bất cứ thứ gì chỉ bởi chính nó; . Nếu bạn muốn khớp với dấu ngoặc vuông bên trái theo nghĩa đen, bạn phải thoát khỏi nó, chẳng hạn như 105. 106 phù hợp cũng là một siêu ký tự; . Đó là một ví dụ về "đôi khi siêu ký tự". Nó không phải là siêu ký tự nếu không có 104 tương ứng và khớp với ký tự theo nghĩa đen của nó 2Danh sách các ký tự trong lớp ký tự cung cấp tập hợp các ký tự phù hợp với lớp. 108 khớp với một chữ "a" hoặc "b" hoặc "c". Nhưng nếu ký tự đầu tiên sau 104 là 110, thay vào đó, lớp sẽ khớp với bất kỳ ký tự nào không có trong danh sách. Trong một danh sách, ký tự 111 chỉ định một dải ký tự, do đó, 112 đại diện cho tất cả các ký tự giữa "a" và "z", bao gồm cả. Nếu bạn muốn bản thân 111 hoặc 106 trở thành thành viên của một lớp, hãy đặt nó ở đầu danh sách (có thể sau 110) hoặc thoát nó bằng dấu gạch chéo ngược. 111 cũng được hiểu theo nghĩa đen khi nó ở cuối danh sách, ngay trước khi kết thúc 106. (Tất cả sau đây chỉ định cùng một lớp gồm ba ký tự. 118, 119 và 120. Tất cả đều khác với 121, chỉ định một lớp chứa 26 ký tự, ngay cả trên các bộ ký tự dựa trên EBCDIC. )Còn nhiều điều nữa đối với các lớp ký tự được đặt trong ngoặc đơn; "Những điều cơ bản" đã giới thiệu một số siêu ký tự. Phần này cung cấp cho họ tất cả. Hầu hết chúng đều có ý nghĩa giống như trong lệnh egrep Chỉ có 57 luôn là một siêu ký tự. Những cái khác đôi khi chỉ là siêu ký tự. Các bảng sau liệt kê tất cả chúng, tóm tắt việc sử dụng chúng và đưa ra ngữ cảnh mà chúng là siêu ký tự. Bên ngoài những bối cảnh đó hoặc nếu có tiền tố là 57, chúng sẽ khớp với ký tự dấu chấm câu tương ứng của chúng. Trong một số trường hợp, ý nghĩa của chúng thay đổi tùy thuộc vào các công cụ sửa đổi mẫu khác nhau làm thay đổi các hành vi mặc định. Xem phần "Công cụ sửa đổi" 0Lưu ý rằng hầu hết các siêu ký tự mất đi ý nghĩa đặc biệt của chúng khi chúng xuất hiện trong một lớp ký tự được đặt trong ngoặc đơn, ngoại trừ 110 có một ý nghĩa khác khi nó ở đầu một lớp như vậy. Và 111 và 106 chỉ là các siêu ký tự ở các vị trí hạn chế trong các lớp ký tự được đặt trong ngoặc đơn; Trong ngữ cảnh trích dẫn kép, như thường lệ, bạn cần cẩn thận về 129 và ký tự không phải là ký tự đại diện 130. Những biến đó có thể nội suy, có thể hoặc không thể là những gì bạn dự địnhCác quy tắc này được thiết kế cho sự gọn nhẹ của biểu thức, thay vì tính dễ đọc và khả năng bảo trì. Công cụ sửa đổi mẫu "/x và /xx" cho phép bạn chèn khoảng trắng để cải thiện khả năng đọc. Và việc sử dụng 131 sẽ bổ sung thêm kiểm tra để phát hiện một số lỗi chính tả có thể âm thầm biên dịch thành nội dung ngoài ý muốnTheo mặc định, ký tự 110 được đảm bảo chỉ khớp với phần đầu của chuỗi, ký tự 129 chỉ ở cuối (hoặc trước dòng mới ở cuối) và Perl thực hiện một số tối ưu hóa với giả định rằng chuỗi chỉ chứa một dòng. Các dòng mới được nhúng sẽ không khớp với 110 hoặc 129. Tuy nhiên, bạn có thể muốn xử lý một chuỗi dưới dạng bộ đệm nhiều dòng, sao cho 110 sẽ khớp sau bất kỳ dòng mới nào trong chuỗi (ngoại trừ nếu dòng mới là ký tự cuối cùng trong chuỗi) và 129 sẽ khớp trước bất kỳ dòng mới nào. Với chi phí cao hơn một chút, bạn có thể thực hiện việc này bằng cách sử dụng công cụ sửa đổi 138 trên toán tử khớp mẫu. (Các chương trình cũ hơn đã thực hiện việc này bằng cách đặt 139, nhưng tùy chọn này đã bị xóa trong perl 5. 10. )Để đơn giản hóa việc thay thế nhiều dòng, ký tự 56 không bao giờ khớp với một dòng mới trừ khi bạn sử dụng công cụ sửa đổi 141, điều này có tác dụng yêu cầu Perl giả vờ chuỗi là một dòng--ngay cả khi nó không phải là# Công cụ sửa đổi#Tổng quanHành vi mặc định để khớp có thể được thay đổi bằng cách sử dụng các công cụ sửa đổi khác nhau. Các công cụ sửa đổi liên quan đến việc giải thích mẫu được liệt kê ngay bên dưới. Các công cụ sửa đổi làm thay đổi cách Perl sử dụng một mẫu được trình bày chi tiết trong "Các toán tử giống như trích dẫn Regexp" trong perlop và "Chi tiết chính xác về phân tích cú pháp các cấu trúc được trích dẫn" trong perlop. Công cụ sửa đổi có thể được thêm động; # 142Coi chuỗi được khớp với nhiều dòng. Nghĩa là, thay đổi 110 và 129 từ khớp đầu dòng đầu tiên của chuỗi và kết thúc dòng cuối cùng thành khớp đầu và cuối mỗi dòng trong chuỗi#____1145Coi chuỗi là một dòng. Nghĩa là, thay đổi 56 để khớp với bất kỳ ký tự nào, kể cả một dòng mới, mà thông thường nó sẽ không khớpĐược sử dụng cùng nhau, như là 147, chúng để cho 56 khớp với bất kỳ ký tự nào, trong khi vẫn cho phép 110 và 129 khớp tương ứng, ngay sau và ngay trước các dòng mới trong chuỗi#____1151Thực hiện so khớp mẫu không phân biệt chữ hoa chữ thường. Ví dụ: "A" sẽ khớp với "a" trong 152Nếu các quy tắc khớp ngôn ngữ có hiệu lực, bản đồ trường hợp được lấy từ ngôn ngữ hiện tại cho các điểm mã nhỏ hơn 255 và từ các quy tắc Unicode cho các điểm mã lớn hơn. Tuy nhiên, các kết quả khớp vượt qua ranh giới quy tắc Unicode/quy tắc không phải Unicode (ords 255/256) sẽ không thành công, trừ khi ngôn ngữ là ngôn ngữ UTF-8. Xem perllocale Có một số ký tự Unicode khớp với một chuỗi nhiều ký tự bên dưới 152. Ví dụ: 154 phải khớp với chuỗi 155. Perl hiện không thể thực hiện việc này khi nhiều ký tự nằm trong mẫu và được phân chia giữa các nhóm hoặc khi một hoặc nhiều ký tự được định lượng. Như vậy 1Perl không khớp với nhiều ký tự trong một lớp ký tự được đặt trong ngoặc vuông trừ khi ký tự ánh xạ tới chúng được đề cập rõ ràng và nó hoàn toàn không khớp với chúng nếu lớp ký tự bị đảo ngược, điều này có thể rất khó hiểu. Xem "Các lớp ký tự được đặt trong ngoặc" trong perlrecharclass và "Phủ định" trong perlrecharclass # 156 và 157Mở rộng mức độ dễ đọc của mẫu của bạn bằng cách cho phép khoảng trắng và nhận xét. Chi tiết trong "/x và /xx" #____1158Giữ nguyên chuỗi đã khớp sao cho 159, 160 và 161 có sẵn để sử dụng sau khi khớpTrong Perl 5. 20 và cao hơn điều này được bỏ qua. Do cơ chế sao chép khi ghi mới, 159, 160 và 161 sẽ có sẵn sau trận đấu bất kể công cụ sửa đổi là gì# 165, 166, 167 và 168Những công cụ sửa đổi này, tất cả đều mới trong 5. 14, ảnh hưởng đến quy tắc bộ ký tự nào (Unicode, v.v. ) được sử dụng, như được mô tả bên dưới trong "Công cụ sửa đổi bộ ký tự" #____1169Ngăn các siêu ký tự nhóm 170 bắt giữ. Công cụ sửa đổi này, mới trong 5. 22, sẽ dừng 171, 172, v.v. từ được điền vào 2Điều này tương đương với việc đặt 173 ở đầu mỗi nhóm chụp 3 174 có thể bị phủ nhận trên cơ sở từng nhóm. Ngoài ra, các ảnh chụp được đặt tên vẫn có thể được sử dụng 4#Các công cụ sửa đổi khácCó một số cờ có thể được tìm thấy ở cuối cấu trúc biểu thức chính quy không phải là cờ biểu thức chính quy chung, nhưng áp dụng cho thao tác đang được thực hiện, chẳng hạn như so khớp hoặc thay thế (lần lượt là ____045 hoặc 46)Các cờ được mô tả thêm trong "Sử dụng biểu thức chính quy trong Perl" trong perlretut là 5Công cụ sửa đổi thay thế cụ thể được mô tả trong "s/PATTERN/REPLACEMENT/msixpodualngcer" trong perlop là 6Công cụ sửa đổi biểu thức chính quy thường được viết trong tài liệu dưới dạng e. g. , "công cụ sửa đổi 177", mặc dù dấu phân cách được đề cập có thể không thực sự là dấu gạch chéo. Công cụ sửa đổi 178 cũng có thể được nhúng trong chính biểu thức chính quy bằng cách sử dụng cấu trúc 179, xem "Mẫu mở rộng" bên dưới#Chi tiết về một số công cụ sửa đổiMột số công cụ sửa đổi yêu cầu giải thích nhiều hơn so với phần "Tổng quan" ở trên #$foo =~ m $foo =~ m |