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

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,

$foo =~ m
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ản

Biể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

$foo =~ m
50 và
$foo =~ m
51, được liệt kê trong "Toán tử liên kết" trong perlop;

$foo =~ m/abc/

Điều này được đánh giá là đúng khi và chỉ khi chuỗi trong biến

$foo =~ m
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

$foo =~ m

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ư

$foo =~ m
1

Nế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. ,

$foo =~ m
54] phục vụ mục đích này

Bấ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

$foo =~ m
55

Chỉ 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

$foo =~ 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ố

$foo =~ m
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 đó,
$foo =~ m
58 chỉ khớp với một dấu chấm theo nghĩa đen,
$foo =~ m
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 đó,
$foo =~ m
60 khớp với một
$foo =~ m
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
$foo =~ m
62 sẽ khớp với bất kỳ chuỗi mục tiêu nào chứa chuỗi
$foo =~ m
63

Siêu ký tự

$foo =~ m
64 được sử dụng để khớp với thứ này hay thứ khác. Như vậy

$foo =~ m
3

là TRUE khi và chỉ khi

$foo =~ m
52 chứa dãy
$foo =~ m
66 hoặc dãy
$foo =~ m
67. Giống như tất cả các siêu ký tự, việc đặt trước
$foo =~ m
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;

$foo =~ m
8

là TRUE khi và chỉ khi

$foo =~ m
52 chứa chuỗi
$foo =~ m
70

Bạn không bị giới hạn chỉ một

$foo =~ m
64

$foo =~ m
2

là ĐÚNG khi và chỉ khi

$foo =~ m
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,

$foo =~ m
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
$foo =~ m
74 và
$foo =~ m
75

$foo =~ m
7

là TRUE khi và chỉ khi

$foo =~ m
52 chứa dãy
$foo =~ m
77 hoặc dãy
$foo =~ m
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 [

$foo =~ m
74,
$foo =~ m
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úc

Cá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

$foo =~ m
83 với
$foo =~ m
84, chỉ phần
$foo =~ m
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à

$foo =~ m
86, khớp với một ranh giới nào đó.
$foo =~ m
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,

$foo =~ m
2

Nó đá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

$foo =~ m
52. Bằng cách sử dụng hợp lý
$foo =~ m
86 [hoặc tốt hơn [vì nó được thiết kế để xử lý ngôn ngữ tự nhiên]
$foo =~ m
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

$foo =~ m
4

Ví dụ cuối cùng cho thấy các ký tự

$foo =~ m
91 và
$foo =~ m
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.

$foo =~ m
93 khớp với một dòng mới,
$foo =~ m
94 một tab,
$foo =~ m
95 một ký tự xuống dòng,
$foo =~ m
96 một nguồn cấp dữ liệu biểu mẫu, v.v.

Tổng quát hơn,

$foo =~ m
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
$foo =~ m
98 để chỉ định bất kỳ số chữ số bát phân nào

Tương tự,

$foo =~ m
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
$foo =~ m
100 để chỉ định bất kỳ số lượng chữ số hex nào

Bên cạnh việc là một siêu ký tự,

$foo =~ m
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
$foo =~ m
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

$foo =~ m
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ự
$foo =~ m
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ư
$foo =~ m
105.
$foo =~ m
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ó
$foo =~ m
104 tương ứng và khớp với ký tự theo nghĩa đen của nó

$foo =~ m/abc/
2

Danh 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.

$foo =~ m
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
$foo =~ m
104 là
$foo =~ m
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ự
$foo =~ m
111 chỉ định một dải ký tự, do đó,
$foo =~ m
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
$foo =~ m
111 hoặc
$foo =~ m
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
$foo =~ m
110] hoặc thoát nó bằng dấu gạch chéo ngược.
$foo =~ m
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
$foo =~ m
106. [Tất cả sau đây chỉ định cùng một lớp gồm ba ký tự.
$foo =~ m
118,
$foo =~ m
119 và
$foo =~ m
120. Tất cả đều khác với
$foo =~ m
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ó

$foo =~ m
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à
$foo =~ m
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"

$foo =~ m
0

Lư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ừ

$foo =~ m
110 có một ý nghĩa khác khi nó ở đầu một lớp như vậy. Và
$foo =~ m
111 và
$foo =~ m
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ề

$foo =~ m
129 và ký tự không phải là ký tự đại diện
$foo =~ m
130. Những biến đó có thể nội suy, có thể hoặc không thể là những gì bạn dự định

Cá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

$foo =~ m
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ốn

Theo mặc định, ký tự

$foo =~ m
110 được đảm bảo chỉ khớp với phần đầu của chuỗi, ký tự
$foo =~ m
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
$foo =~ m
110 hoặc
$foo =~ m
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
$foo =~ m
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à
$foo =~ m
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
$foo =~ m
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
$foo =~ m
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ự

$foo =~ m
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
$foo =~ m
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 quan

Hà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;

#
$foo =~ m
142

Coi chuỗi được khớp với nhiều dòng. Nghĩa là, thay đổi

$foo =~ m
110 và
$foo =~ m
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

#____1145

Coi chuỗi là một dòng. Nghĩa là, thay đổi

$foo =~ m
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à

$foo =~ m
147, chúng để cho
$foo =~ m
56 khớp với bất kỳ ký tự nào, trong khi vẫn cho phép
$foo =~ m
110 và
$foo =~ m
129 khớp tương ứng, ngay sau và ngay trước các dòng mới trong chuỗi

#____1151

Thự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

$foo =~ m
152

Nế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

$foo =~ m
152. Ví dụ:
$foo =~ m
154 phải khớp với chuỗi
$foo =~ m
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

$foo =~ m
1

Perl 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

#
$foo =~ m
156 và
$foo =~ m
157

Mở 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"

#____1158

Giữ nguyên chuỗi đã khớp sao cho

$foo =~ m
159,
$foo =~ m
160 và
$foo =~ m
161 có sẵn để sử dụng sau khi khớp

Trong Perl 5. 20 và cao hơn điều này được bỏ qua. Do cơ chế sao chép khi ghi mới,

$foo =~ m
159,
$foo =~ m
160 và
$foo =~ m
161 sẽ có sẵn sau trận đấu bất kể công cụ sửa đổi là gì

#
$foo =~ m
165,
$foo =~ m
166,
$foo =~ m
167 và
$foo =~ m
168

Nhữ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ự"

#____1169

Ngăn các siêu ký tự nhóm

$foo =~ m
170 bắt giữ. Công cụ sửa đổi này, mới trong 5. 22, sẽ dừng
$foo =~ m
171,
$foo =~ m
172, v.v. từ được điền vào

$foo =~ m
2

Điều này tương đương với việc đặt

$foo =~ m
173 ở đầu mỗi nhóm chụp

$foo =~ m
3

$foo =~ m
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

$foo =~ m
4#Các công cụ sửa đổi khác

Có 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

$foo =~ m
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à

$foo =~ m
5

Công cụ sửa đổi thay thế cụ thể được mô tả trong "s/PATTERN/REPLACEMENT/msixpodualngcer" trong perlop là

$foo =~ m
6

Cô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

$foo =~ m
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
$foo =~ m
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
$foo =~ m
179, xem "Mẫu mở rộng" bên dưới

#Chi tiết về một số công cụ sửa đổi

Mộ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
177 và
$foo =~ m
181

Một

$foo =~ m
177 duy nhất yêu cầu trình phân tích cú pháp biểu thức chính quy bỏ qua hầu hết các khoảng trắng không bị gạch chéo ngược cũng như không nằm trong lớp ký tự được đặt trong ngoặc đơn. Bạn có thể sử dụng điều này để chia biểu thức chính quy của mình thành các phần dễ đọc hơn. Ngoài ra, ký tự
$foo =~ m
183 được coi là một siêu ký tự giới thiệu một nhận xét chạy đến dấu phân cách đóng của mẫu hoặc đến cuối dòng hiện tại nếu mẫu mở rộng sang dòng tiếp theo. Do đó, điều này rất giống với một bình luận mã Perl bình thường. [Bạn chỉ có thể bao gồm dấu phân cách kết thúc trong nhận xét nếu bạn đặt dấu gạch chéo ngược trước nhận xét đó, vì vậy hãy cẩn thận. ]

Việc sử dụng

$foo =~ m
177 có nghĩa là nếu bạn muốn có khoảng trắng thực hoặc ký tự
$foo =~ m
183 trong mẫu [bên ngoài lớp ký tự trong ngoặc đơn, không bị ảnh hưởng bởi
$foo =~ m
177], thì bạn sẽ phải thoát khỏi chúng [sử dụng dấu gạch chéo ngược hoặc
$foo =~ m
187] hoặc mã hóa chúng bằng hệ bát phân . Sẽ không hiệu quả khi cố gắng tiếp tục nhận xét ở dòng tiếp theo bằng cách thoát khỏi ____1190 bằng dấu gạch chéo ngược hoặc ____1191

Bạn có thể sử dụng "[?#text]" để tạo nhận xét kết thúc sớm hơn phần cuối của dòng hiện tại, nhưng

$foo =~ m
192 cũng không thể chứa dấu phân cách đóng trừ khi thoát bằng dấu gạch chéo ngược

A common pitfall is to forget that

$foo =~ m
183 characters [outside a bracketed character class] begin a comment under
$foo =~ m
177 and are not matched literally. Chỉ cần ghi nhớ điều đó khi cố gắng tìm ra lý do tại sao một mẫu
$foo =~ m
177 cụ thể không hoạt động như mong đợi. Bên trong một lớp ký tự được đặt trong ngoặc,
$foo =~ m
183 vẫn giữ nguyên nghĩa đen, không đặc biệt của nó

Bắt đầu từ Perl v5. 26, nếu công cụ sửa đổi có một

$foo =~ m
197 thứ hai bên trong nó, hiệu ứng của một
$foo =~ m
177 đơn lẻ sẽ tăng lên. Sự khác biệt duy nhất là bên trong các lớp ký tự được đặt trong ngoặc, các ký tự SPACE và TAB không thoát [bằng dấu gạch chéo ngược] không được thêm vào lớp và do đó có thể được chèn vào để làm cho các lớp dễ đọc hơn

$foo =~ m
7

may be easier to grasp than the squashed equivalents

$foo =~ m
8

Note that this unfortunately doesn't mean that your bracketed classes can contain comments or extend over multiple lines. A

$foo =~ m
199 inside a character class is still just a literal
$foo =~ m
199, and doesn't introduce a comment. Và, trừ khi dấu ngoặc đóng nằm trên cùng một dòng với dấu mở đầu, ký tự xuống dòng [và mọi thứ trên [các] dòng tiếp theo cho đến khi kết thúc bởi ____2301] sẽ là một phần của lớp, giống như khi bạn viết ____1190

Taken together, these features go a long way towards making Perl's regular expressions more readable. Here's an example

$foo =~ m
9

Note that anything inside a

$foo =~ m
187 stays unaffected by
$foo =~ m
177. And note that
$foo =~ m
177 doesn't affect space interpretation within a single multi-character construct. Ví dụ:
$foo =~ m
306 không thể có khoảng cách giữa
$foo =~ m
74,
$foo =~ m
308 và
$foo =~ m
309. Trong bất kỳ dấu phân cách nào cho một cấu trúc như vậy, các khoảng trống được phép không bị ảnh hưởng bởi
$foo =~ m
177 và phụ thuộc vào cấu trúc. Ví dụ: tất cả các cấu trúc sử dụng dấu ngoặc nhọn làm dấu phân cách, chẳng hạn như
$foo =~ m
100 có thể có khoảng trống bên trong nhưng liền kề với dấu ngoặc nhọn, nhưng không ở nơi nào khác và không có ký tự khoảng trắng không trống. Một ngoại lệ là các thuộc tính Unicode tuân theo các quy tắc Unicode, xem phần "Các thuộc tính có thể truy cập thông qua \p{} và \P{}" trong perluniprops

Tập hợp các ký tự được coi là khoảng trắng là những ký tự mà Unicode gọi là "Khoảng trắng mẫu", cụ thể là

$foo =~ m
10

#Công cụ sửa đổi bộ ký tự

$foo =~ m
312,
$foo =~ m
313,
$foo =~ m
314 và
$foo =~ m
315, có sẵn từ 5. 14, được gọi là công cụ sửa đổi bộ ký tự;

Các công cụ sửa đổi

$foo =~ m
312,
$foo =~ m
313 và
$foo =~ m
315 dường như không được bạn sử dụng nhiều, vì vậy bạn không cần phải lo lắng nhiều về chúng. Chúng tồn tại để sử dụng nội bộ của Perl, do đó các cấu trúc dữ liệu biểu thức chính quy phức tạp có thể được tự động tuần tự hóa và sau đó được khôi phục chính xác, bao gồm tất cả các sắc thái của chúng. Tuy nhiên, vì Perl không thể giữ bí mật và có thể có những trường hợp hiếm hoi mà chúng hữu ích, nên chúng được ghi lại ở đây

Mặt khác, công cụ sửa đổi

$foo =~ m
314 có thể hữu ích. Mục đích của nó là cho phép mã hoạt động chủ yếu trên dữ liệu ASCII không phải quan tâm đến Unicode

Tóm lại,

$foo =~ m
315 đặt bộ ký tự thành bộ ký tự của bất kỳ Ngôn ngữ nào có hiệu lực tại thời điểm thực hiện khớp mẫu

$foo =~ m
313 đặt bộ ký tự thành Unicode

$foo =~ m
314 cũng đặt bộ ký tự thành Unicode, NHƯNG thêm một số hạn chế đối với kết hợp an toàn ASCII

$foo =~ m
312 là cũ, có vấn đề, trước 5. 14 Hành vi bộ ký tự mặc định. Công dụng duy nhất của nó là buộc hành vi cũ đó

Tại bất kỳ thời điểm nào, chính xác một trong những công cụ sửa đổi này có hiệu lực. Sự tồn tại của chúng cho phép Perl giữ hành vi được biên dịch ban đầu của biểu thức chính quy, bất kể quy tắc nào có hiệu lực khi nó thực sự được thực thi. Và nếu nó được nội suy thành một biểu thức chính quy lớn hơn, các quy tắc của bản gốc sẽ tiếp tục áp dụng cho nó và không ảnh hưởng đến các phần khác

Các công cụ sửa đổi

$foo =~ m
315 và
$foo =~ m
313 được chọn tự động cho các biểu thức chính quy được biên dịch trong phạm vi của các ngữ dụng khác nhau và chúng tôi khuyên rằng nói chung, bạn nên sử dụng các ngữ dụng đó thay vì chỉ định rõ ràng các công cụ sửa đổi này. Đối với một điều, các công cụ sửa đổi chỉ ảnh hưởng đến khớp mẫu và không mở rộng đến bất kỳ sự thay thế nào được thực hiện, trong khi sử dụng các pragma mang lại kết quả nhất quán cho tất cả các hoạt động thích hợp trong phạm vi của chúng. Ví dụ,

$foo =~ m
11

sẽ khớp "foo" bằng cách sử dụng các quy tắc của ngôn ngữ để khớp không phân biệt chữ hoa chữ thường, nhưng

$foo =~ m
315 không ảnh hưởng đến cách thức hoạt động của
$foo =~ m
327. Nhiều khả năng bạn muốn cả hai sử dụng quy tắc ngôn ngữ. Để làm điều này, thay vào đó hãy biên dịch biểu thức chính quy trong phạm vi của
$foo =~ m
328. Điều này vừa ngầm thêm
$foo =~ m
315, vừa áp dụng các quy tắc ngôn ngữ cho
$foo =~ m
327. Bài học là
$foo =~ m
328, chứ không phải
$foo =~ m
315 một cách rõ ràng

Tương tự, sẽ tốt hơn nếu sử dụng

$foo =~ m
333 thay vì,

$foo =~ m
12

để có được các quy tắc Unicode, vì

$foo =~ m
334 trước đây [nhưng không nhất thiết phải là cái sau] cũng sẽ sử dụng các quy tắc Unicode

Chi tiết hơn về từng công cụ sửa đổi sau. Rất có thể bạn không cần biết chi tiết này đối với

$foo =~ m
315,
$foo =~ m
313 và
$foo =~ m
312 và có thể chuyển sang phần /a

#/l

có nghĩa là sử dụng các quy tắc của ngôn ngữ hiện tại [xem perllocale] khi khớp mẫu. Ví dụ:

$foo =~ m
338 sẽ khớp với các ký tự "từ" của ngôn ngữ đó và đối sánh
$foo =~ m
339 không phân biệt chữ hoa chữ thường sẽ khớp theo quy tắc gấp chữ hoa chữ thường của ngôn ngữ đó. Ngôn ngữ được sử dụng sẽ là ngôn ngữ có hiệu lực tại thời điểm thực hiện so khớp mẫu. Điều này có thể không giống với ngôn ngữ thời gian biên dịch và có thể khác nhau từ trận đấu này sang trận đấu khác nếu có một cuộc gọi can thiệp của hàm setlocale[]

Trước v5. 20, Perl không hỗ trợ ngôn ngữ nhiều byte. Kể từ đó, ngôn ngữ UTF-8 được hỗ trợ. Không có ngôn ngữ nhiều byte nào khác có khả năng được hỗ trợ. Tuy nhiên, ở tất cả các ngôn ngữ, một người có thể có các điểm mã trên 255 và những mã này sẽ luôn được coi là Unicode bất kể ngôn ngữ nào có hiệu lực

Theo quy tắc Unicode, có một vài trường hợp không phân biệt chữ hoa chữ thường vượt qua ranh giới 255/256. Ngoại trừ các ngôn ngữ UTF-8 trong Perls v5. 20 trở lên, những thứ này không được phép theo

$foo =~ m
315. Ví dụ: 0xFF [trên nền tảng ASCII] không khớp với ký tự ở 0x178,
$foo =~ m
341, bởi vì 0xFF có thể không phải là
$foo =~ m
342 trong ngôn ngữ hiện tại và Perl không có cách nào để biết liệu ký tự đó có tồn tại trong ngôn ngữ đó hay không.

Trong ngôn ngữ UTF-8 trong v5. 20 trở lên, sự khác biệt có thể nhìn thấy duy nhất giữa ngôn ngữ và không phải ngôn ngữ trong các biểu thức chính quy sẽ bị mờ, nếu perl của bạn hỗ trợ kiểm tra dấu vết [xem perlsec]

Công cụ sửa đổi này có thể được chỉ định làm mặc định bởi

$foo =~ m
328, nhưng hãy xem "Công cụ sửa đổi bộ ký tự nào có hiệu lực?"

#/bạn

có nghĩa là sử dụng quy tắc Unicode khi khớp mẫu. Trên nền tảng ASCII, điều này có nghĩa là các điểm mã từ 128 đến 255 mang ý nghĩa Latin-1 [ISO-8859-1] của chúng [giống như của Unicode]. [Nếu không thì Perl coi ý nghĩa của chúng là không xác định. ] Do đó, theo công cụ sửa đổi này, nền tảng ASCII thực sự trở thành nền tảng Unicode;

Không giống như hầu hết các ngôn ngữ dành riêng cho một cặp ngôn ngữ và quốc gia, Unicode phân loại tất cả các ký tự là các chữ cái ở đâu đó trên thế giới là

$foo =~ m
338. Ví dụ: địa phương của bạn có thể không nghĩ rằng
$foo =~ m
346 là một chữ cái [trừ khi bạn nói tiếng Iceland], nhưng Unicode thì có. Tương tự, tất cả các ký tự là chữ số thập phân ở đâu đó trên thế giới sẽ khớp với
$foo =~ m
347; . Và một số trong những chữ số đó trông giống như một số trong 10 chữ số ASCII, nhưng có nghĩa là một số khác, vì vậy con người có thể dễ dàng nghĩ rằng một số là một số lượng khác với thực tế. Ví dụ:
$foo =~ m
348 [U+09EA] trông rất giống
$foo =~ m
349 [U+0038] và
$foo =~ m
350 [U+1C46] trông rất giống
$foo =~ m
351 [U+0035]. Và,
$foo =~ m
352, có thể khớp với các chuỗi chữ số hỗn hợp từ các hệ thống chữ viết khác nhau, tạo ra sự cố bảo mật. Ví dụ: một trang web lừa đảo có thể hiển thị giá của một thứ gì đó bằng cách sử dụng U+1C46 và người dùng sẽ thấy rằng một thứ gì đó có giá 500 đơn vị, nhưng nó thực sự có giá 600. Trình duyệt thực thi tập lệnh chạy ["Tập lệnh chạy"] sẽ ngăn hiển thị gian lận đó. "num[]" trong Unicode. UCD cũng có thể được sử dụng để giải quyết vấn đề này. Hoặc công cụ sửa đổi
$foo =~ m
314 có thể được sử dụng để buộc
$foo =~ m
347 chỉ khớp với ASCII từ 0 đến 9

Ngoài ra, theo công cụ sửa đổi này, khớp phân biệt chữ hoa chữ thường hoạt động trên toàn bộ ký tự Unicode. Ví dụ,

$foo =~ m
355 khớp với các chữ cái "k" và "K"; . Xem https. // unicode. org/reports/tr36 để có thảo luận chi tiết về các vấn đề bảo mật Unicode

Công cụ sửa đổi này có thể được chỉ định làm mặc định bởi

$foo =~ m
357,
$foo =~ m
358 hoặc
$foo =~ m
359 [hoặc cao hơn], nhưng hãy xem phần "Công cụ sửa đổi bộ ký tự nào có hiệu lực?"

#/d

QUAN TRỌNG. Do các hành vi không thể đoán trước mà công cụ sửa đổi này gây ra, chỉ sử dụng nó để duy trì khả năng tương thích ngược kỳ lạ. Sử dụng tính năng

$foo =~ m
360 trong mã mới để tránh vô tình bật công cụ sửa đổi này theo mặc định

Công cụ sửa đổi này làm gì?

Công cụ sửa đổi này có nghĩa là sử dụng các quy tắc đối sánh dựa trên nền tảng ngoại trừ khi có lý do để sử dụng các quy tắc Unicode thay thế, như sau

  1. cờ UTF8 của chuỗi mục tiêu [xem bên dưới] được đặt;

  2. cờ UTF8 của mẫu [xem bên dưới] được đặt;

  3. mẫu đề cập rõ ràng đến một điểm mã cao hơn 255 [ví dụ bởi

    $foo =~ m
    361];

  4. mẫu sử dụng tên Unicode [

    $foo =~ m
    362];

  5. the pattern uses a Unicode property [

    $foo =~ m
    363 or
    $foo =~ m
    364]; or

  6. mẫu sử dụng dấu ngắt Unicode [

    $foo =~ m
    365 hoặc
    $foo =~ m
    366];

  7. mẫu sử dụng

    $foo =~ m
    367

  8. mẫu sử dụng

    $foo =~ m
    368

Liên quan đến các tài liệu tham khảo "cờ UTF8" ở trên. thông thường các ứng dụng Perl không nên nghĩ về lá cờ đó. Nó là một phần bên trong của Perl, vì vậy nó có thể thay đổi bất cứ khi nào Perl muốn. Do đó,

$foo =~ m
312 có thể gây ra kết quả không thể đoán trước. Xem ""Lỗi Unicode"" trong perlunicode. Lỗi này đã trở nên khá khét tiếng, dẫn đến những cái tên khác [không chửi thề] cho công cụ sửa đổi này như "Dicey" và "Dodgy"

Dưới đây là một số ví dụ về cách hoạt động trên nền tảng ASCII

$foo =~ m
13

Under Perl's default configuration this modifier is automatically selected by default when none of the others are, so yet another name for it [unfortunately] is "Default"

Whenever you can, use the

$foo =~ m
360 to cause to be the default instead

#/a [and /aa]

Công cụ sửa đổi này là viết tắt của ASCII-restrict [hoặc ASCII-safe]. This modifier may be doubled-up to increase its effect

When it appears singly, it causes the sequences

$foo =~ m
347,
$foo =~ m
372,
$foo =~ m
338, and the Posix character classes to match only in the ASCII range. They thus revert to their pre-5. 6, pre-Unicode meanings. Under
$foo =~ m
314,
$foo =~ m
347 always means precisely the digits
$foo =~ m
376 to
$foo =~ m
377;
$foo =~ m
372 means the five characters
$foo =~ m
379, and starting in Perl v5. 18, the vertical tab;
$foo =~ m
338 means the 63 characters
$foo =~ m
381; and likewise, all the Posix classes such as
$foo =~ m
382 match only the appropriate ASCII-range characters

This modifier is useful for people who only incidentally use Unicode, and who do not wish to be burdened with its complexities and security concerns

With

$foo =~ m
314, one can write
$foo =~ m
347 with confidence that it will only match ASCII characters, and should the need arise to match beyond ASCII, you can instead use
$foo =~ m
385 [or
$foo =~ m
386 for
$foo =~ m
338]. There are similar
$foo =~ m
363 constructs that can match beyond ASCII both white space [see "Whitespace" in perlrecharclass], and Posix classes [see "POSIX Character Classes" in perlrecharclass]. Thus, this modifier doesn't mean you can't use Unicode, it means that to get Unicode matching you must explicitly use a construct [
$foo =~ m
389,
$foo =~ m
390] that signals Unicode

As you would expect, this modifier causes, for example,

$foo =~ m
391 to mean the same thing as
$foo =~ m
392; in fact, all non-ASCII characters match
$foo =~ m
391,
$foo =~ m
394, and
$foo =~ m
395.
$foo =~ m
86 still means to match at the boundary between
$foo =~ m
338 and
$foo =~ m
395, using the
$foo =~ m
314 definitions of them [similarly for
$foo =~ m
800]

Otherwise,

$foo =~ m
314 behaves like the
$foo =~ m
313 modifier, in that case-insensitive matching uses Unicode rules; for example, "k" will match the Unicode
$foo =~ m
803 under
$foo =~ m
152 matching, and code points in the Latin1 range, above ASCII will have Unicode rules when it comes to case-insensitive matching

To forbid ASCII/non-ASCII matches [like "k" with

$foo =~ m
803], specify the
$foo =~ m
806 twice, for example
$foo =~ m
807 or
$foo =~ m
808. [The first occurrence of
$foo =~ m
806 restricts the
$foo =~ m
347, etc. , and the second occurrence adds the
$foo =~ m
152 restrictions. ] But, note that code points outside the ASCII range will use Unicode rules for
$foo =~ m
152 matching, so the modifier doesn't really restrict things to just ASCII; it just forbids the intermixing of ASCII and non-ASCII

To summarize, this modifier provides protection for applications that don't wish to be exposed to all of Unicode. Specifying it twice gives added protection

This modifier may be specified to be the default by

$foo =~ m
813 or
$foo =~ m
814. If you do so, you may actually have occasion to use the
$foo =~ m
313 modifier explicitly if there are a few regular expressions where you do want full Unicode rules [but even here, it's best if everything were under feature
$foo =~ m
816, along with the
$foo =~ m
814]. Also see "Which character set modifier is in effect?"

#Which character set modifier is in effect?

Which of these modifiers is in effect at any given point in a regular expression depends on a fairly complex set of interactions. These have been designed so that in general you don't have to worry about it, but this section gives the gory details. As explained below in "Extended Patterns" it is possible to explicitly specify modifiers that apply only to portions of a regular expression. Phần trong cùng luôn được ưu tiên hơn bất kỳ phần bên ngoài nào và một phần áp dụng cho toàn bộ biểu thức sẽ được ưu tiên hơn bất kỳ cài đặt mặc định nào được mô tả trong phần còn lại của phần này

The

$foo =~ m
818 pragma can be used to set default modifiers [including these] for regular expressions compiled within its scope. This pragma has precedence over the other pragmas listed below that also change the defaults

Otherwise,

$foo =~ m
819 sets the default modifier to
$foo =~ m
315; and
$foo =~ m
821, or
$foo =~ m
359 [or higher] set the default to
$foo =~ m
313 when not in the same scope as either
$foo =~ m
819 or
$foo =~ m
825. [
$foo =~ m
826 also sets the default to
$foo =~ m
313, overriding any plain
$foo =~ m
328. ] Unlike the mechanisms mentioned above, these affect operations besides regular expressions pattern matching, and so give more consistent results with other operators, including using
$foo =~ m
327,
$foo =~ m
830, etc. in substitution replacements

If none of the above apply, for backwards compatibility reasons, the

$foo =~ m
312 modifier is the one in effect by default. As this can lead to unexpected results, it is best to specify which other rule set should be used

#Character set modifier behavior prior to Perl 5. 14

Prior to 5. 14, there were no explicit modifiers, but

$foo =~ m
315 was implied for regexes compiled within the scope of
$foo =~ m
328, and
$foo =~ m
312 was implied otherwise. However, interpolating a regex into a larger regex would ignore the original compilation in favor of whatever was in effect at the time of the second compilation. Có một số điểm không nhất quán [lỗi] với công cụ sửa đổi
$foo =~ m
312, trong đó các quy tắc Unicode sẽ được sử dụng khi không phù hợp và ngược lại.
$foo =~ m
389 did not imply Unicode rules, and neither did all occurrences of
$foo =~ m
188, until 5. 12

#Regular Expressions

#Quantifiers

Quantifiers are used when a particular portion of a pattern needs to match a certain number [or numbers] of times. If there isn't a quantifier the number of times to match is exactly one. The following standard quantifiers are recognized

$foo =~ m
14

[If a non-escaped curly bracket occurs in a context other than one of the quantifiers listed above, where it does not form part of a backslashed sequence like

$foo =~ m
100, it is either a fatal syntax error, or treated as a regular character, generally with a deprecation warning raised. To escape it, you can precede it with a backslash [
$foo =~ m
839] or enclose it within square brackets [
$foo =~ m
840]. This change will allow for future syntax extensions [like making the lower bound of a quantifier optional], and better error checking of quantifiers]

The

$foo =~ m
841 quantifier is equivalent to
$foo =~ m
842, the
$foo =~ m
843 quantifier to
$foo =~ m
844, and the
$foo =~ m
308 quantifier to
$foo =~ m
846. n and m are limited to non-negative integral values less than a preset limit defined when perl is built. This is usually 65534 on the most common platforms. The actual limit can be seen in the error message generated by code such as this

$foo =~ m
15

Theo mặc định, một mẫu con được định lượng là "tham lam", nghĩa là nó sẽ khớp nhiều lần nhất có thể [với một vị trí bắt đầu cụ thể] trong khi vẫn cho phép phần còn lại của mẫu khớp. If you want it to match the minimum number of times possible, follow the quantifier with a

$foo =~ m
308. Note that the meanings don't change, just the "greediness"

$foo =~ m
16

Normally when a quantified subpattern does not allow the rest of the overall pattern to match, Perl will backtrack. However, this behaviour is sometimes undesirable. Thus Perl provides the "possessive" quantifier form as well

$foo =~ m
17

For instance,

$foo =~ m
18

will never match, as the

$foo =~ m
848 will gobble up all the
$foo =~ m
806's in the string and won't leave any for the remaining part of the pattern. This feature can be extremely useful to give perl hints about where it shouldn't backtrack. Chẳng hạn, vấn đề "khớp chuỗi trích dẫn kép" điển hình có thể được thực hiện hiệu quả nhất khi được viết dưới dạng

$foo =~ m
19

as we know that if the final quote does not match, backtracking will not help. See the independent subexpression

$foo =~ m
850 for more details; possessive quantifiers are just syntactic sugar for that construct. For instance the above example could also be written as follows

$foo =~ m
30

Note that the possessive quantifier modifier can not be combined with the non-greedy modifier. This is because it would make no sense. Xét bảng tương đương sau

$foo =~ m
31

#Escape sequences

Because patterns are processed as double-quoted strings, the following also work

$foo =~ m
32

Details are in "Quote and Quote-like Operators" in perlop

#Character Classes and other Special Escapes

In addition, Perl defines the following

$foo =~ m
33#[1]

See "Bracketed Character Classes" in perlrecharclass for details

#[2]

See "POSIX Character Classes" in perlrecharclass for details

#[3]

See "Unicode Character Properties" in perlunicode for details

#[4]

See "Misc" in perlrebackslash for details

#[5]

See "Capture groups" below for details

#[6]

Xem "Mẫu mở rộng" bên dưới để biết chi tiết

#[7]

Note that

$foo =~ m
851 has two meanings. Khi có dạng
$foo =~ m
852, nó khớp với ký tự hoặc chuỗi ký tự có tên là TÊN; . Mặt khác, nó khớp với bất kỳ ký tự nào trừ
$foo =~ m
190

#[số 8]

Xem "Các lớp nhân vật được mở rộng" trong perlrecharclass để biết chi tiết

#khẳng định

Bên cạnh

$foo =~ m
110 và
$foo =~ m
129, Perl định nghĩa các xác nhận độ rộng bằng 0 sau đây

$foo =~ m
34

Ranh giới Unicode [

$foo =~ m
857], khả dụng bắt đầu từ v5. 22, là vị trí giữa hai ký tự hoặc trước ký tự đầu tiên trong chuỗi hoặc sau ký tự cuối cùng trong chuỗi đáp ứng các tiêu chí nhất định do Unicode xác định. Xem "\b{}, \b, \B{}, \B" trong perlrebackslash để biết chi tiết

Ranh giới từ [

$foo =~ m
86] là một điểm giữa hai ký tự có một bên là
$foo =~ m
338 và một bên là
$foo =~ m
395 [theo một trong hai thứ tự], đếm các ký tự tưởng tượng ở đầu và cuối chuỗi là phù hợp . [Trong các lớp ký tự
$foo =~ m
86 đại diện cho khoảng lùi chứ không phải ranh giới từ, giống như nó thường xảy ra trong bất kỳ chuỗi trích dẫn kép nào. ]
$foo =~ m
863 và
$foo =~ m
864 giống như
$foo =~ m
110 và
$foo =~ m
129, ngoại trừ việc chúng sẽ không khớp nhiều lần khi công cụ sửa đổi
$foo =~ m
867 được sử dụng, trong khi
$foo =~ m
110 và
$foo =~ m
129 sẽ khớp ở mọi ranh giới đường bên trong. Để khớp với phần cuối thực của chuỗi và không bỏ qua một dòng mới ở cuối tùy chọn, hãy sử dụng
$foo =~ m
870

Xác nhận

$foo =~ m
871 có thể được sử dụng để xâu chuỗi các đối sánh toàn cầu [sử dụng
$foo =~ m
872], như được mô tả trong "Các toán tử giống như trích dẫn Regexp" trong perlop. Nó cũng hữu ích khi viết các máy quét giống như
$foo =~ m
873, khi bạn có một số mẫu mà bạn muốn so khớp với các chuỗi con tiếp theo của chuỗi của bạn; . Vị trí thực tế mà
$foo =~ m
871 sẽ khớp cũng có thể bị ảnh hưởng bằng cách sử dụng
$foo =~ m
875 làm giá trị. xem "pos" trong perlfunc. Lưu ý rằng quy tắc đối sánh độ dài bằng 0 [xem "Các mẫu lặp lại khớp với chuỗi con có độ dài bằng 0"] được sửa đổi phần nào, trong đó nội dung ở bên trái của
$foo =~ m
871 không được tính khi xác định độ dài của đối sánh. Do đó, những điều sau đây sẽ không khớp mãi mãi

$foo =~ m
35

Nó sẽ in 'A' và sau đó chấm dứt, vì nó coi kết quả khớp có độ rộng bằng 0 và do đó sẽ không khớp ở cùng một vị trí hai lần liên tiếp

Điều đáng chú ý là việc sử dụng

$foo =~ m
871 không đúng cách có thể dẫn đến vòng lặp vô hạn. Cẩn thận khi sử dụng các mẫu bao gồm
$foo =~ m
871 xen kẽ

Cũng lưu ý rằng

$foo =~ m
46 sẽ từ chối ghi đè lên một phần thay thế đã được thay thế;

$foo =~ m
36

#Chụp nhóm

Cấu trúc nhóm

$foo =~ m
880 tạo các nhóm chụp [còn được gọi là bộ đệm chụp]. Để tham khảo nội dung hiện tại của một nhóm sau này, trong cùng một mẫu, hãy sử dụng
$foo =~ m
881 [hoặc
$foo =~ m
882] cho nhóm đầu tiên,
$foo =~ m
883 [hoặc
$foo =~ m
884] cho nhóm thứ hai, v.v. Điều này được gọi là phản hồi. Không có giới hạn về số lượng chuỗi con đã bắt mà bạn có thể sử dụng. Các nhóm được đánh số với dấu ngoặc mở ngoài cùng bên trái là số 1, v.v. Nếu một nhóm không khớp, tham chiếu ngược được liên kết cũng sẽ không khớp. [Điều này có thể xảy ra nếu nhóm là tùy chọn hoặc trong một nhánh khác của nhóm luân phiên. ] Bạn có thể bỏ đi ________ 2885 và viết ________ 2886, v.v., nhưng có một số vấn đề với biểu mẫu này, được mô tả bên dưới

Bạn cũng có thể đề cập đến các nhóm chụp một cách tương đối, bằng cách sử dụng số âm, sao cho cả

$foo =~ m
887 và
$foo =~ m
888 đều đề cập đến nhóm chụp ngay trước đó và cả
$foo =~ m
889 và
$foo =~ m
890 đều đề cập đến nhóm trước nó. Ví dụ

$foo =~ m
37

sẽ khớp giống như

$foo =~ m
891. Điều này cho phép bạn nội suy các biểu thức chính quy thành các biểu thức chính quy lớn hơn và không phải lo lắng về việc các nhóm chụp được đánh số lại

Bạn có thể phân phối hoàn toàn với các số và tạo các nhóm chụp được đặt tên. Ký hiệu là ________ 2892 để khai báo và ________ 2893 để tham khảo. [Để tương thích với. Biểu thức chính quy thuần,

$foo =~ m
893 cũng có thể được viết là
$foo =~ m
895,
$foo =~ m
896 hoặc
$foo =~ m
897. ] tên không được bắt đầu bằng số, cũng không được chứa dấu gạch ngang. Khi các nhóm khác nhau trong cùng một mẫu có cùng tên, bất kỳ tham chiếu nào đến tên đó đều giả định nhóm được xác định ngoài cùng bên trái. Các nhóm được đặt tên được tính theo cách đánh số tuyệt đối và tương đối, do đó cũng có thể được gọi bằng các số đó. [Có thể thực hiện mọi việc với các nhóm chụp được đặt tên mà nếu không sẽ yêu cầu
$foo =~ m
898. ]

Nội dung của nhóm chụp có phạm vi động và có sẵn cho bạn bên ngoài mẫu cho đến khi kết thúc khối kèm theo hoặc cho đến khi khớp thành công tiếp theo, tùy theo điều kiện nào đến trước. [Xem "Câu lệnh ghép" trong perlsyn. ] Bạn có thể gọi chúng theo số tuyệt đối [dùng

$foo =~ m
899 thay vì
$foo =~ m
200, v.v.];

Dấu ngoặc nhọn được yêu cầu khi đề cập đến các nhóm chụp được đặt tên, nhưng là tùy chọn đối với các nhóm được đánh số tuyệt đối hoặc tương đối. Niềng răng an toàn hơn khi tạo biểu thức chính quy bằng cách nối các chuỗi nhỏ hơn. Ví dụ: nếu bạn có

$foo =~ m
203 và
$foo =~ m
204 chứa
$foo =~ m
200 và
$foo =~ m
206 chứa
$foo =~ m
207, bạn sẽ nhận được
$foo =~ m
208, đây có thể không phải là ý định của bạn

Nếu bạn sử dụng dấu ngoặc nhọn, bạn cũng có thể tùy ý thêm bất kỳ số lượng ký tự trống [dấu cách hoặc tab] nào bên trong nhưng liền kề với dấu ngoặc nhọn, chẳng hạn như

$foo =~ m
209 hoặc
$foo =~ m
210

Các ký hiệu

$foo =~ m
211 và
$foo =~ m
212 đã được giới thiệu trong Perl 5. 10. 0. Trước đó, không có nhóm chụp được đặt tên cũng như được đánh số tương đối. Các nhóm được đánh số tuyệt đối được gọi bằng cách sử dụng
$foo =~ m
213,
$foo =~ m
214, v.v. và ký hiệu này vẫn được chấp nhận [và có thể sẽ luôn như vậy]. Nhưng nó dẫn đến một số sự mơ hồ nếu có nhiều hơn 9 nhóm chụp, vì
$foo =~ m
215 có thể có nghĩa là nhóm chụp thứ mười hoặc ký tự có thứ tự trong bát phân là 010 [một khoảng lùi trong ASCII]. Perl giải quyết sự không rõ ràng này bằng cách giải thích
$foo =~ m
215 như một phản hồi chỉ khi ít nhất 10 dấu ngoặc đơn bên trái đã mở trước nó. Tương tự như vậy,
$foo =~ m
217 chỉ là một tham chiếu ngược nếu có ít nhất 11 dấu ngoặc đơn bên trái được mở trước nó. Và như thế.
$foo =~ m
213 đến
$foo =~ m
219 luôn được hiểu là phản hồi. Có một số ví dụ dưới đây minh họa những nguy cơ này. Bạn có thể tránh sự mơ hồ bằng cách luôn sử dụng
$foo =~ m
220 hoặc
$foo =~ m
211 nếu bạn muốn chụp các nhóm;

Ký hiệu

$foo =~ m
224 cũng hoạt động trong một số trường hợp bên ngoài mẫu. Xem "Cảnh báo trên \1 Thay vì $1" bên dưới để biết chi tiết

ví dụ

$foo =~ m
38

Một số biến đặc biệt cũng tham khảo lại các phần của trận đấu trước.

$foo =~ m
225 trả về bất cứ giá trị nào mà đối sánh khung cuối cùng được khớp.
$foo =~ m
226 trả về toàn bộ chuỗi khớp. [Tại một thời điểm,
$foo =~ m
227 cũng đã làm, nhưng bây giờ nó trả về tên của chương trình. ]
$foo =~ m
228 trả về mọi thứ trước chuỗi khớp.
$foo =~ m
229 trả về mọi thứ sau chuỗi khớp. Và
$foo =~ m
230 chứa bất cứ thứ gì được khớp bởi nhóm đóng gần đây nhất [đối sánh phụ].
$foo =~ m
230 có thể được sử dụng trong các mẫu mở rộng [xem bên dưới], chẳng hạn như để gán một đối sánh phụ cho một biến

Các biến đặc biệt này, như hàm băm

$foo =~ m
201 và các biến khớp được đánh số [
$foo =~ m
171,
$foo =~ m
172,
$foo =~ m
235, v.v. ] được xác định phạm vi động cho đến khi kết thúc khối kèm theo hoặc cho đến khi khớp thành công tiếp theo, tùy theo điều kiện nào đến trước. [Xem "Câu lệnh ghép" trong perlsyn. ]

The

$foo =~ m
236 array may be used to access ALL of the capture buffers as an array without needing to know how many there are. For instance

$foo =~ m
39

will place a copy of each capture variable,

$foo =~ m
171,
$foo =~ m
172 etc, into the
$foo =~ m
239 array

Be aware that when interpolating a subscript of the

$foo =~ m
236 array you must use demarcated curly brace notation

$foo =~ m
80

See "Demarcated variable names using braces" in perldata for more on this notation

NOTE. Các kết quả khớp không thành công trong Perl không đặt lại các biến khớp, điều này giúp dễ dàng viết mã kiểm tra một loạt các trường hợp cụ thể hơn và ghi nhớ kết quả khớp tốt nhất

WARNING. If your code is to run on Perl 5. 16 or earlier, beware that once Perl sees that you need one of

$foo =~ m
226,
$foo =~ m
228, or
$foo =~ m
229 anywhere in the program, it has to provide them for every pattern match. This may substantially slow your program

Perl uses the same mechanism to produce

$foo =~ m
171,
$foo =~ m
172, etc, so you also pay a price for each pattern that contains capturing parentheses. [To avoid this cost while retaining the grouping behaviour, use the extended regular expression
$foo =~ m
246 instead. ] But if you never use
$foo =~ m
226,
$foo =~ m
228 or
$foo =~ m
229, then patterns without capturing parentheses will not be penalized. So avoid
$foo =~ m
226,
$foo =~ m
229, and
$foo =~ m
228 if you can, but if you can't [and some algorithms really appreciate them], once you've used them once, use them at will, because you've already paid the price

Perl 5. 16 introduced a slightly more efficient mechanism that notes separately whether each of

$foo =~ m
228,
$foo =~ m
226, and
$foo =~ m
229 have been seen, and thus may only need to copy part of the string. Perl 5. 20 introduced a much more efficient copy-on-write mechanism which eliminates any slowdown

As another workaround for this problem, Perl 5. 10. 0 introduced

$foo =~ m
159,
$foo =~ m
160 and
$foo =~ m
161, which are equivalent to
$foo =~ m
228,
$foo =~ m
226 and
$foo =~ m
229, except that they are only guaranteed to be defined after a successful match that was executed with the
$foo =~ m
262 [preserve] modifier. Việc sử dụng các biến này không bị phạt hiệu suất toàn cầu, không giống như các ký tự dấu chấm câu tương đương của chúng, tuy nhiên, bạn phải thông báo cho Perl khi muốn sử dụng chúng. As of Perl 5. 20, these three variables are equivalent to
$foo =~ m
228,
$foo =~ m
226 and
$foo =~ m
229, and
$foo =~ m
262 is ignored

Các siêu ký tự gạch chéo ngược trong Perl là chữ và số, chẳng hạn như

$foo =~ m
86,
$foo =~ m
338,
$foo =~ m
190. Không giống như một số ngôn ngữ biểu thức chính quy khác, không có ký hiệu gạch chéo ngược nào không phải là chữ và số. Vì vậy, bất cứ thứ gì trông giống như
$foo =~ m
270,
$foo =~ m
271,
$foo =~ m
272,
$foo =~ m
273,
$foo =~ m
274,
$foo =~ m
275 hoặc
$foo =~ m
276 luôn được hiểu là một ký tự chữ, không phải là ký tự đại diện. Điều này đã từng được sử dụng trong một thành ngữ phổ biến để vô hiệu hóa hoặc trích dẫn ý nghĩa đặc biệt của các siêu ký tự biểu thức chính quy trong một chuỗi mà bạn muốn sử dụng cho một mẫu. Chỉ cần trích dẫn tất cả các ký tự không phải là "từ"

$foo =~ m
81

[Nếu

$foo =~ m
328 được đặt, thì điều này phụ thuộc vào ngôn ngữ hiện tại. ] Ngày nay, người ta thường sử dụng hàm
$foo =~ m
278 hoặc chuỗi thoát siêu dữ liệu
$foo =~ m
191 để vô hiệu hóa ý nghĩa đặc biệt của tất cả các siêu ký tự như thế này

$foo =~ m
82

Xin lưu ý rằng nếu bạn đặt dấu gạch chéo ngược theo nghĩa đen [những dấu gạch chéo ngược không nằm trong biến nội suy] giữa

$foo =~ m
191 và
$foo =~ m
281, phép nội suy dấu gạch chéo ngược dấu ngoặc kép có thể dẫn đến kết quả khó hiểu. Nếu bạn cần sử dụng dấu gạch chéo ngược theo nghĩa đen trong
$foo =~ m
187, hãy tham khảo "Chi tiết chính xác về phân tích cấu trúc được trích dẫn" trong perlop

$foo =~ m
283 và
$foo =~ m
191 được mô tả đầy đủ trong "quotemeta" trong perlfunc

#Mô hình mở rộng

Perl cũng định nghĩa một cú pháp mở rộng nhất quán cho các tính năng không có trong các công cụ tiêu chuẩn như awk và lex. Cú pháp của hầu hết trong số này là một cặp dấu ngoặc đơn với dấu chấm hỏi là điều đầu tiên trong ngoặc đơn. Ký tự sau dấu chấm hỏi cho biết phần mở rộng

Một dấu chấm hỏi đã được chọn cho điều này và cho cấu trúc đối sánh tối thiểu vì 1] dấu hỏi rất hiếm trong các biểu thức chính quy cũ hơn và 2] bất cứ khi nào bạn nhìn thấy một dấu hỏi, bạn nên dừng lại và "đặt câu hỏi" chính xác chuyện gì đang xảy ra. Đó là tâm lý học

#____3285

Một lời bình luận. Văn bản bị bỏ qua. Lưu ý rằng Perl đóng nhận xét ngay khi nhìn thấy một

$foo =~ m
75, vì vậy không có cách nào để đặt một
$foo =~ m
75 theo nghĩa đen trong nhận xét. Dấu phân cách đóng của mẫu phải được thoát bằng dấu gạch chéo ngược nếu nó xuất hiện trong nhận xét

Xem "/x" để biết cách khác để có nhận xét theo mẫu

Lưu ý rằng một nhận xét có thể xuất hiện ở bất cứ đâu, ngoại trừ ở giữa một chuỗi thoát. ví dụ

$foo =~ m
83#
$foo =~ m
288#______3289

Không hoặc nhiều công cụ sửa đổi khớp mẫu được nhúng, sẽ được bật [hoặc tắt nếu đứng trước

$foo =~ m
111] cho phần còn lại của mẫu hoặc phần còn lại của nhóm mẫu kèm theo [nếu có]

Điều này đặc biệt hữu ích cho các mẫu được tạo động, chẳng hạn như các mẫu được đọc từ tệp cấu hình, được lấy từ một đối số hoặc được chỉ định trong một bảng ở đâu đó. Xem xét trường hợp một số mẫu muốn phân biệt chữ hoa chữ thường và một số thì không. Những cái không phân biệt chữ hoa chữ thường chỉ cần bao gồm

$foo =~ m
291 ở phía trước mẫu. Ví dụ

$foo =~ m
84

Các công cụ sửa đổi này được khôi phục ở cuối nhóm kèm theo. Ví dụ,

$foo =~ m
85

sẽ khớp với

$foo =~ m
292 trong mọi trường hợp, một số dấu cách và chính xác [bao gồm cả trường hợp. ] lặp lại từ trước đó, giả sử từ bổ nghĩa
$foo =~ m
177 và không có từ bổ nghĩa
$foo =~ m
152 nào bên ngoài nhóm này

Các công cụ sửa đổi này không chuyển sang các mẫu con có tên được gọi trong nhóm kèm theo. Nói cách khác, một mẫu chẳng hạn như

$foo =~ m
295 không thay đổi phân biệt chữ hoa chữ thường của mẫu NAME

Một công cụ sửa đổi bị ghi đè bởi các lần xuất hiện sau của cấu trúc này trong cùng một phạm vi chứa cùng một công cụ sửa đổi, do đó

$foo =~ m
86

khớp với tất cả

$foo =~ m
296 không phân biệt chữ hoa chữ thường, nhưng chỉ sử dụng quy tắc
$foo =~ m
867 cho phần
$foo =~ m
298. Cờ
$foo =~ m
806 cũng ghi đè lên
$foo =~ m
700; . Điều tương tự cũng xảy ra với
$foo =~ m
197 và
$foo =~ m
157. Do đó, trong

$foo =~ m
87

cả

$foo =~ m
177 và
$foo =~ m
181 đều bị tắt trong khi khớp với
$foo =~ m
298. Và trong

$foo =~ m
88

$foo =~ m
177 nhưng KHÔNG
$foo =~ m
181 được bật để khớp với
$foo =~ m
298. [Người ta có thể lầm tưởng rằng vì
$foo =~ m
711 bên trong đã thuộc phạm vi của
$foo =~ m
177, nên kết quả sẽ thực sự là tổng của chúng, mang lại
$foo =~ m
181. Nó không hoạt động theo cách đó. ] Tương tự như vậy, làm điều gì đó như
$foo =~ m
714 sẽ tắt tất cả hành vi của ________ 1197 để khớp với
$foo =~ m
298, không phải là bạn trừ 1 ________ 1197 từ 2 để nhận được 1
$foo =~ m
197 còn lại

Bất kỳ công cụ sửa đổi nào trong số này đều có thể được đặt để áp dụng trên toàn cầu cho tất cả các biểu thức chính quy được biên dịch trong phạm vi của một

$foo =~ m
719. Xem chế độ "'/flags'" trong lại

Bắt đầu từ Perl 5. 14, một

$foo =~ m
110 [dấu mũ hoặc dấu mũ] ngay sau
$foo =~ m
308 là cách viết tắt tương đương với
$foo =~ m
722. Các cờ [ngoại trừ
$foo =~ m
723] có thể đi theo dấu mũ để ghi đè lên nó. Nhưng một dấu trừ là không hợp pháp với nó

Lưu ý rằng các công cụ sửa đổi

$foo =~ m
806,
$foo =~ m
723,
$foo =~ m
726,
$foo =~ m
727 và
$foo =~ m
728 đặc biệt ở chỗ chúng chỉ có thể được bật chứ không thể bị vô hiệu hóa và các công cụ sửa đổi
$foo =~ m
806,
$foo =~ m
723,
$foo =~ m
726 và
$foo =~ m
728 là loại trừ lẫn nhau. chỉ định một cái bỏ chỉ định những cái khác và tối đa một [hoặc hai
$foo =~ m
806] có thể xuất hiện trong cấu trúc. Do đó, ví dụ,
$foo =~ m
734 sẽ cảnh báo khi được biên dịch theo
$foo =~ m
735;

Cũng lưu ý rằng công cụ sửa đổi

$foo =~ m
727 đặc biệt ở chỗ sự hiện diện của nó ở bất kỳ đâu trong mẫu có hiệu ứng toàn cầu

Việc không có công cụ sửa đổi nào khiến điều này trở thành không hoạt động [vậy tại sao bạn lại chỉ định nó, trừ khi nó được tạo mã] và bắt đầu từ v5. 30, cảnh báo dưới

$foo =~ m
49

#______3740#______3741#
$foo =~ m
742

Điều này là để phân cụm, không chụp; . Cho nên

$foo =~ m
89

khớp với các dấu phân cách trường giống như

$foo =~ m
20

nhưng không tạo ra các dấu phân cách dưới dạng các trường bổ sung [mặc dù đó là hành vi "tách" trong perlfunc khi mẫu của nó chứa các nhóm bắt giữ]. Việc không chụp các ký tự cũng rẻ hơn nếu bạn không cần

Bất kỳ chữ cái nào giữa

$foo =~ m
308 và
$foo =~ m
309 đóng vai trò bổ trợ cờ như với
$foo =~ m
747. Ví dụ,

$foo =~ m
21

tương đương với dài dòng hơn

$foo =~ m
22

Lưu ý rằng bất kỳ cấu trúc

$foo =~ m
170 nào được đính kèm trong cấu trúc này sẽ vẫn được chụp trừ khi công cụ sửa đổi
$foo =~ m
174 có hiệu lực

Giống như cấu trúc "[?adlupimnsx-imnsx]",

$foo =~ m
700 và
$foo =~ m
806 ghi đè lẫn nhau, cũng như
$foo =~ m
157 và
$foo =~ m
197. Chúng không phải là phụ gia. Vì vậy, làm điều gì đó như
$foo =~ m
754 sẽ tắt tất cả hành vi của
$foo =~ m
197 để khớp với
$foo =~ m
298

Bắt đầu từ Perl 5. 14, một

$foo =~ m
110 [dấu mũ hoặc dấu mũ] ngay sau
$foo =~ m
308 là cách viết tắt tương đương với
$foo =~ m
722. Bất kỳ cờ dương nào [ngoại trừ
$foo =~ m
723] đều có thể đi theo dấu mũ, vì vậy

$foo =~ m
23

tương đương với

$foo =~ m
24

Dấu mũ cho Perl biết rằng cụm này không kế thừa các cờ của bất kỳ mẫu xung quanh nào, mà sử dụng các giá trị mặc định của hệ thống [

$foo =~ m
722], được sửa đổi bởi bất kỳ cờ nào được chỉ định

Dấu mũ cho phép xâu chuỗi các biểu thức chính quy được biên dịch đơn giản hơn. Những thứ này trông giống như

$foo =~ m
25

với bất kỳ cờ không mặc định nào xuất hiện giữa dấu mũ và dấu hai chấm. Do đó, một bài kiểm tra xem xét quá trình xâu chuỗi như vậy không cần phải mã hóa cứng các cờ mặc định của hệ thống, chỉ cần dấu mũ. Nếu các cờ mới được thêm vào Perl, ý nghĩa của phần mở rộng dấu mũ sẽ thay đổi để bao gồm giá trị mặc định cho các cờ đó, do đó, thử nghiệm sẽ vẫn hoạt động, không thay đổi

Chỉ định một cờ phủ định sau dấu mũ là một lỗi, vì cờ này là dư thừa

Ghi nhớ cho

$foo =~ m
762. Một khởi đầu mới vì việc sử dụng dấu mũ thông thường là để khớp ngay từ đầu

#____3763

Đây là mẫu "thiết lập lại nhánh", có thuộc tính đặc biệt là các nhóm chụp được đánh số từ cùng một điểm bắt đầu trong mỗi nhánh luân phiên. Nó có sẵn bắt đầu từ perl 5. 10. 0

Các nhóm chụp được đánh số từ trái sang phải, nhưng bên trong cấu trúc này, việc đánh số được bắt đầu lại cho mỗi nhánh

Việc đánh số trong mỗi nhánh sẽ diễn ra bình thường và bất kỳ nhóm nào theo sau cấu trúc này sẽ được đánh số như thể cấu trúc chỉ chứa một nhánh, đó là nhóm có nhiều nhóm chụp nhất trong đó

Cấu trúc này hữu ích khi bạn muốn nắm bắt một trong số các đối sánh thay thế

Hãy xem xét mô hình sau. Các số bên dưới hiển thị nội dung đã chụp sẽ được lưu trữ trong nhóm nào

$foo =~ m
26

Hãy cẩn thận khi sử dụng mẫu đặt lại nhánh kết hợp với các ảnh chụp được đặt tên. Các bản chụp được đặt tên được triển khai dưới dạng bí danh cho các nhóm được đánh số giữ các bản chụp và điều đó cản trở việc triển khai mẫu thiết lập lại nhánh. Nếu bạn đang sử dụng các ảnh chụp có tên trong mẫu thiết lập lại nhánh, thì tốt nhất bạn nên sử dụng các tên giống nhau, theo cùng một thứ tự, trong mỗi cách thay thế

$foo =~ m
27

Không làm như vậy có thể dẫn đến bất ngờ

$foo =~ m
28

Vấn đề ở đây là cả nhóm có tên

$foo =~ m
165 và nhóm có tên
$foo =~ m
765 đều là bí danh của nhóm thuộc về
$foo =~ m
171

Xác nhận #Lookaround

Các xác nhận nhìn xung quanh là các mẫu có độ rộng bằng 0 khớp với một mẫu cụ thể mà không bao gồm mẫu đó trong

$foo =~ m
226. Các xác nhận tích cực khớp khi mẫu con của chúng khớp với nhau, các xác nhận phủ định khớp khi mẫu con của chúng không thành công. Lookbehind khớp văn bản với vị trí khớp hiện tại, lookahead khớp văn bản sau vị trí khớp hiện tại

#
$foo =~ m
768#
$foo =~ m
769#
$foo =~ m
770

Xác nhận nhìn trước tích cực có độ rộng bằng 0. Ví dụ:

$foo =~ m
771 khớp với một từ theo sau bởi một tab, mà không bao gồm tab trong
$foo =~ m
226

#______3773#______3774#
$foo =~ m
775

Xác nhận tra cứu phủ định có độ rộng bằng 0. Ví dụ:

$foo =~ m
776 khớp với bất kỳ lần xuất hiện nào của "foo" không được theo sau bởi "bar". Tuy nhiên, xin lưu ý rằng lookahead và lookbehind KHÔNG giống nhau. Bạn không thể sử dụng điều này cho lookbehind

Nếu bạn đang tìm kiếm một "thanh" không có "foo" đứng trước, thì

$foo =~ m
777 sẽ không làm được điều bạn muốn. Đó là bởi vì
$foo =~ m
778 chỉ nói rằng thứ tiếp theo không thể là "foo"--và không phải, nó là "bar", vì vậy "foobar" sẽ khớp. Thay vào đó, hãy sử dụng lookbehind [xem bên dưới]

#
$foo =~ m
779#
$foo =~ m
780#
$foo =~ m
781#
$foo =~ m
782

Xác nhận giao diện tích cực có độ rộng bằng 0. Ví dụ:

$foo =~ m
783 khớp với một từ theo sau tab, mà không bao gồm tab trong
$foo =~ m
226

Trước Perl 5. 30, nó chỉ hoạt động cho giao diện có chiều rộng cố định, nhưng bắt đầu từ bản phát hành đó, nó có thể xử lý các độ dài thay đổi từ 1 đến 255 ký tự như một tính năng thử nghiệm. Tính năng này được bật tự động nếu bạn sử dụng xác nhận giao diện tích cực có độ dài thay đổi

Trong Perl 5. 35. 10 phạm vi bản chất thử nghiệm của cấu trúc này đã bị giảm và các cảnh báo thử nghiệm sẽ chỉ được tạo khi cấu trúc chứa dấu ngoặc đơn bắt. Các cảnh báo sẽ được đưa ra tại thời điểm biên dịch mẫu, trừ khi bị tắt, trong danh mục

$foo =~ m
785. Điều này là để cảnh báo bạn rằng nội dung chính xác của việc chụp bộ đệm trong giao diện tích cực có độ dài thay đổi không được xác định rõ và có thể thay đổi trong bản phát hành tương lai của perl

Hiện tại, nếu bạn sử dụng bộ đệm chụp bên trong giao diện có độ dài thay đổi dương, kết quả sẽ là kết quả dài nhất và do đó có thể khớp với bên trái nhất có thể. Điều này có nghĩa rằng

$foo =~ m
29

tất cả sẽ dẫn đến

$foo =~ m
171 chứa
$foo =~ m
787. Có thể trong bản phát hành perl trong tương lai, chúng tôi sẽ thay đổi hành vi này

Có một dạng đặc biệt của cấu trúc này, được gọi là

$foo =~ m
780 [có từ Perl 5. 10. 0], khiến công cụ regex "giữ" mọi thứ mà nó đã khớp trước
$foo =~ m
780 và không bao gồm nó trong
$foo =~ m
226. Điều này cung cấp một cách hiệu quả giao diện độ dài thay đổi phi thử nghiệm ở bất kỳ độ dài nào

Và, có một kỹ thuật có thể được sử dụng để xử lý các giao diện có độ dài thay đổi trên các bản phát hành trước đó và dài hơn 255 ký tự. Nó được mô tả trong http. //www. dregex. com/2019/02/biến-độ-dài-nhìn-thực-tế. html

Lưu ý rằng dưới

$foo =~ m
152, một vài ký tự đơn khớp với hai hoặc ba ký tự khác. Điều này làm cho chúng có độ dài thay đổi và độ dài 255 áp dụng cho số lượng ký tự tối đa trong trận đấu. Ví dụ:
$foo =~ m
792 khớp với chuỗi
$foo =~ m
793. Xác nhận giao diện của bạn có thể chứa 127 ký tự Sharp S bên dưới
$foo =~ m
152, nhưng việc thêm ký tự thứ 128 sẽ tạo ra lỗi biên dịch, vì điều đó có thể khớp với 256 ký tự
$foo =~ m
795 liên tiếp

Việc sử dụng

$foo =~ m
780 bên trong một xác nhận tìm kiếm khác được cho phép, nhưng hành vi hiện chưa được xác định rõ

Vì nhiều lý do,

$foo =~ m
780 có thể hiệu quả hơn đáng kể so với cấu trúc
$foo =~ m
798 tương đương và nó đặc biệt hữu ích trong các trường hợp bạn muốn loại bỏ một cách hiệu quả thứ gì đó theo sau thứ khác trong chuỗi. Ví dụ

$foo =~ m
70

có thể được viết lại là hiệu quả hơn nhiều

$foo =~ m
71

Việc sử dụng công cụ sửa đổi không tham lam

$foo =~ m
308 có thể không mang lại cho bạn kết quả như mong đợi nếu nó nằm trong nhóm bắt giữ trong cấu trúc

#
$foo =~ m
200#______3201#
$foo =~ m
202

Xác nhận giao diện phủ định có độ rộng bằng 0. Ví dụ

$foo =~ m
203

$foo =~ m
098
$foo =~ m
211
$foo =~ m
211
$foo =~ m
213#
$foo =~ m
214

Một nhóm chụp được đặt tên. Giống hệt nhau về mọi mặt đối với dấu ngoặc đơn thông thường

$foo =~ m
170 nhưng thực tế bổ sung là nhóm có thể được gọi theo tên trong các cấu trúc biểu thức chính quy khác nhau [như
$foo =~ m
216] và có thể được truy cập theo tên sau khi khớp thành công qua
$foo =~ m
201 hoặc
$foo =~ m
218. Xem perlvar để biết thêm chi tiết về giá trị băm
$foo =~ m
201 và
$foo =~ m
218

Nếu nhiều nhóm chụp riêng biệt có cùng tên, thì

$foo =~ m
221 sẽ đề cập đến nhóm được xác định ngoài cùng bên trái trong trận đấu

Các mẫu

$foo =~ m
214 và
$foo =~ m
223 là tương đương

GHI CHÚ. Mặc dù ký hiệu của cấu trúc này giống như hàm tương tự trong. NET regex, hành vi này không. Trong Perl, các nhóm được đánh số liên tục bất kể được đặt tên hay không. Như vậy trong mô hình

$foo =~ m
76

$foo =~ m
224 sẽ giống như
$foo =~ m
172 và
$foo =~ m
235 sẽ chứa 'z' thay vì ngược lại, đó là một. NET regex hacker có thể mong đợi

Hiện tại, NAME chỉ được giới hạn ở các số nhận dạng đơn giản. Nói cách khác, nó phải khớp với

$foo =~ m
227 hoặc phần mở rộng Unicode của nó [xem utf8], mặc dù nó không được mở rộng theo ngôn ngữ [xem perllocale]

GHI CHÚ. Để tạo điều kiện dễ dàng hơn cho các lập trình viên có kinh nghiệm với công cụ biểu thức chính quy Python hoặc PCRE, mẫu

$foo =~ m
228 có thể được sử dụng thay vì
$foo =~ m
223;

#______3230#
$foo =~ m
231#
$foo =~ m
232

phản hồi được đặt tên. Tương tự như phản hồi số, ngoại trừ nhóm được chỉ định theo tên chứ không phải số. Nếu nhiều nhóm có cùng tên thì nó đề cập đến nhóm được xác định ngoài cùng bên trái trong trận đấu hiện tại

Đó là một lỗi khi đề cập đến một tên không được xác định bởi một

$foo =~ m
233 trước đó trong mẫu

Cả ba dạng đều tương đương, mặc dù với

$foo =~ m
234, bạn có thể tùy chọn có khoảng trống bên trong nhưng liền kề với dấu ngoặc nhọn, như minh họa

GHI CHÚ. Để tạo điều kiện dễ dàng hơn cho các lập trình viên có kinh nghiệm với công cụ biểu thức chính Python hoặc PCRE, mẫu

$foo =~ m
235 có thể được sử dụng thay vì
$foo =~ m
230

#____3237

CẢNH BÁO. Sử dụng tính năng này một cách an toàn yêu cầu bạn phải hiểu những hạn chế của nó. Mã được thực thi có tác dụng phụ có thể không hoạt động giống hệt nhau từ phiên bản này sang phiên bản khác do ảnh hưởng của các tối ưu hóa trong tương lai trong công cụ biểu thức chính quy. Để biết thêm thông tin về điều này, hãy xem "Tần suất thực thi mã nhúng"

Xác nhận độ rộng bằng 0 này thực thi bất kỳ mã Perl nhúng nào. Nó luôn thành công và giá trị trả về của nó được đặt là

$foo =~ m
238

Trong các mẫu chữ, mã được phân tích cú pháp cùng lúc với mã xung quanh. Trong khi ở trong mẫu, điều khiển tạm thời được chuyển trở lại trình phân tích cú pháp perl, cho đến khi gặp dấu ngoặc đóng cân bằng logic. Điều này tương tự như cách mà một biểu thức chỉ mục mảng trong một chuỗi ký tự được xử lý, chẳng hạn

$foo =~ m
77

Đặc biệt, niềng răng không cần niềng

$foo =~ m
78

Ngay cả trong một mẫu được nội suy và biên dịch trong thời gian chạy, các khối mã theo nghĩa đen sẽ được biên dịch một lần, tại thời điểm biên dịch perl;

$foo =~ m
79

Trong các mẫu mà văn bản của mã được lấy từ thông tin thời gian chạy thay vì xuất hiện theo nghĩa đen trong mã nguồn /pattern/, mã được biên dịch cùng lúc với mẫu được biên dịch và vì lý do bảo mật,

$foo =~ m
239 phải được . Điều này là để ngăn các mẫu do người dùng cung cấp có chứa các đoạn mã không thể thực thi được

Trong trường hợp bạn cần bật tính năng này với

$foo =~ m
239, bạn cũng nên bật tính năng kiểm tra dấu vết, nếu perl của bạn hỗ trợ tính năng này. Tốt hơn nữa, hãy sử dụng đánh giá được hạn chế cẩn thận trong Ngăn an toàn. Xem perlsec để biết chi tiết về cả hai cơ chế này

Từ quan điểm phân tích cú pháp, phạm vi biến từ vựng và bao đóng,

$foo =~ m
20

hành xử gần giống như

$foo =~ m
21

Tương tự,

$foo =~ m
22

hành xử gần giống như

$foo =~ m
23

Đặc biệt

$foo =~ m
24

Bên trong một khối

$foo =~ m
241,
$foo =~ m
242 đề cập đến chuỗi mà biểu thức chính quy khớp với. Bạn cũng có thể sử dụng
$foo =~ m
875 để biết vị trí khớp hiện tại trong chuỗi này là gì

Khối mã giới thiệu một phạm vi mới từ góc độ khai báo biến từ vựng, nhưng không phải từ góc độ của

$foo =~ m
244 và các hành vi bản địa hóa tương tự. Vì vậy, các khối mã sau này trong cùng một mẫu sẽ vẫn thấy các giá trị đã được bản địa hóa trong các khối trước đó. Các bản địa hóa tích lũy này sẽ được hoàn tác khi kết thúc khớp thành công hoặc nếu xác nhận được quay lui [so sánh với "Quay lui"]. Ví dụ,

$foo =~ m
25

ban đầu sẽ tăng

$foo =~ m
245 lên đến 8; . Khi kết thúc quá trình thực thi regex,
$foo =~ m
245 sẽ được trả về giá trị ban đầu là 0

Khẳng định này có thể được sử dụng như một điều kiện trong một

$foo =~ m
26

công tắc điện. Nếu không sử dụng theo cách này, kết quả đánh giá mã được đưa vào biến đặc biệt

$foo =~ m
238. Điều này xảy ra ngay lập tức, vì vậy có thể sử dụng
$foo =~ m
238 từ các xác nhận
$foo =~ m
237 khác bên trong cùng một biểu thức chính quy

Việc gán cho

$foo =~ m
238 ở trên được bản địa hóa chính xác, vì vậy giá trị cũ của
$foo =~ m
238 được khôi phục nếu xác nhận được quay lại;

Lưu ý rằng biến đặc biệt

$foo =~ m
230 đặc biệt hữu ích với các khối mã để nắm bắt kết quả của các kết quả khớp con trong các biến mà không cần phải theo dõi số lượng dấu ngoặc đơn lồng nhau. Ví dụ

$foo =~ m
27#
$foo =~ m
254

CẢNH BÁO. Sử dụng tính năng này một cách an toàn yêu cầu bạn phải hiểu những hạn chế của nó. Mã được thực thi có tác dụng phụ có thể không hoạt động giống hệt nhau từ phiên bản này sang phiên bản khác do ảnh hưởng của các tối ưu hóa trong tương lai trong công cụ biểu thức chính quy. Để biết thêm thông tin về điều này, hãy xem "Tần suất thực thi mã nhúng"

Đây là một biểu thức con thông thường "bị hoãn". Nó hoạt động giống hệt như một khối mã

$foo =~ m
237 như được mô tả ở trên, ngoại trừ giá trị trả về của nó, thay vì được gán cho
$foo =~ m
238, được coi là một mẫu, được biên dịch nếu đó là một chuỗi [hoặc được sử dụng nguyên trạng nếu nó là một qr

Trong quá trình so khớp của mẫu phụ này, nó có tập hợp các ảnh chụp riêng hợp lệ trong quá trình khớp phụ, nhưng sẽ bị loại bỏ khi điều khiển quay trở lại mẫu chính. Ví dụ: các khớp sau đây, với mẫu bên trong bắt "B" và khớp "BB", trong khi mẫu bên ngoài bắt "A";

$foo =~ m
28

Lưu ý rằng điều này có nghĩa là không có cách nào để mẫu bên trong tham chiếu đến nhóm chụp được xác định bên ngoài. [Bản thân khối mã có thể sử dụng

$foo =~ m
171, v.v. , để chỉ các nhóm chụp của mẫu kèm theo. ] Như vậy, mặc dù

$foo =~ m
29

sẽ khớp, nó sẽ không đặt

$foo =~ m
171 khi thoát

Mẫu sau phù hợp với một nhóm được đặt trong ngoặc đơn

$foo =~ m
40

Xem thêm

$foo =~ m
259 để biết cách khác, hiệu quả hơn để hoàn thành cùng một nhiệm vụ

Thực thi một biểu thức chính quy bị hoãn quá nhiều lần mà không sử dụng bất kỳ chuỗi đầu vào nào cũng sẽ dẫn đến lỗi nghiêm trọng. Độ sâu mà điều đó xảy ra được biên dịch thành perl, vì vậy nó có thể được thay đổi bằng bản dựng tùy chỉnh

#______3259
$foo =~ m
261
$foo =~ m
262
$foo =~ m
263
$foo =~ m
264

Mẫu con đệ quy. Xử lý nội dung của bộ đệm chụp đã cho trong mẫu hiện tại dưới dạng mẫu con độc lập và cố gắng khớp nó ở vị trí hiện tại trong chuỗi. Thông tin về trạng thái chụp từ người gọi đối với những thứ như tham chiếu ngược có sẵn cho mẫu con, nhưng bộ đệm chụp do mẫu con đặt không hiển thị cho người gọi

Tương tự như

$foo =~ m
254 ngoại trừ việc nó không liên quan đến việc thực thi bất kỳ mã nào hoặc có khả năng biên dịch chuỗi mẫu được trả về; . Một điểm khác nữa là cách xử lý bộ đệm chụp, không giống như các mẫu đệ quy
$foo =~ m
254 có quyền truy cập vào trạng thái khớp của trình gọi của chúng, vì vậy người ta có thể sử dụng phản hồi một cách an toàn

PARNO là một chuỗi các chữ số [không bắt đầu bằng 0] có giá trị phản ánh số paren của nhóm chụp được chuyển đến.

$foo =~ m
263 lặp lại phần đầu của toàn bộ mẫu.
$foo =~ m
264 là một cú pháp thay thế cho
$foo =~ m
263. Nếu PARNO đứng trước dấu cộng hoặc dấu trừ thì nó được coi là tương đối, với các số âm biểu thị các nhóm chụp trước và các nhóm dương theo sau. Do đó,
$foo =~ m
270 đề cập đến nhóm được khai báo gần đây nhất và
$foo =~ m
271 chỉ ra nhóm tiếp theo sẽ được khai báo. Lưu ý rằng cách đếm đối với đệ quy tương đối khác với cách tính đối chiếu ngược tương đối, ở chỗ với đệ quy các nhóm không được bao gồm được bao gồm

Mẫu sau khớp với một hàm

$foo =~ m
272 có thể chứa các dấu ngoặc đơn cân bằng làm đối số

$foo =~ m
41

Nếu mẫu được sử dụng như sau

$foo =~ m
42

đầu ra được sản xuất phải như sau

$foo =~ m
43

Nếu không có nhóm chụp tương ứng được xác định, thì đó là lỗi nghiêm trọng. Đệ quy sâu mà không sử dụng bất kỳ chuỗi đầu vào nào cũng sẽ dẫn đến lỗi nghiêm trọng. Độ sâu mà điều đó xảy ra được biên dịch thành perl, vì vậy nó có thể được thay đổi bằng bản dựng tùy chỉnh

Phần sau đây cho thấy cách sử dụng lập chỉ mục phủ định có thể giúp dễ dàng nhúng các mẫu đệ quy bên trong cấu trúc

$foo =~ m
47 để sử dụng sau này

$foo =~ m
44

Lưu ý rằng mẫu này không hoạt động giống như cấu trúc PCRE hoặc Python tương đương có cùng dạng. Trong Perl, bạn có thể quay lại vào một nhóm được đệ quy, trong PCRE và Python, nhóm được đệ quy được coi là nguyên tử. Ngoài ra, các công cụ sửa đổi được giải quyết tại thời điểm biên dịch, vì vậy các cấu trúc như

$foo =~ m
274 hoặc
$foo =~ m
275 không ảnh hưởng đến cách xử lý mẫu phụ

#____3276

Đệ quy đến một mẫu con được đặt tên. Giống hệt với

$foo =~ m
259 ngoại trừ dấu ngoặc đơn để lặp lại được xác định theo tên. Nếu nhiều dấu ngoặc đơn có cùng tên, thì nó sẽ lặp lại ở ngoài cùng bên trái

Đó là một lỗi khi đề cập đến một tên không được khai báo ở đâu đó trong mẫu

GHI CHÚ. Để tạo điều kiện dễ dàng hơn cho các lập trình viên có kinh nghiệm với công cụ biểu thức chính Python hoặc PCRE, mẫu

$foo =~ m
278 có thể được sử dụng thay vì
$foo =~ m
276

#____3280#______3281

Biểu thức điều kiện. Khớp với mẫu có nếu điều kiện mang lại giá trị thực, ngược lại khớp với không có mẫu. Một mẫu bị thiếu luôn khớp

$foo =~ m
282 phải là một trong

#một số nguyên trong ngoặc đơn

[hợp lệ nếu khớp với cặp dấu ngoặc đơn tương ứng];

#a nhìn trước/nhìn sau/đánh giá xác nhận có độ rộng bằng 0;#a tên trong dấu ngoặc nhọn hoặc dấu nháy đơn

[hợp lệ nếu một nhóm có tên phù hợp];

#biểu tượng đặc biệt
$foo =~ m
283

[true khi được đánh giá bên trong đệ quy hoặc eval]. Ngoài ra,

$foo =~ m
284 có thể được theo sau bởi một số, [điều này sẽ đúng khi được đánh giá khi đệ quy bên trong nhóm thích hợp] hoặc bởi
$foo =~ m
285, trong trường hợp đó, nó sẽ chỉ đúng khi được đánh giá trong quá trình đệ quy trong nhóm được đặt tên

Dưới đây là tóm tắt các vị từ có thể

#____3286
$foo =~ m
287

Kiểm tra xem nhóm chụp được đánh số có khớp với thứ gì đó không. Cú pháp đầy đủ.

$foo =~ m
288

#____3289
$foo =~ m
290

Kiểm tra xem một nhóm có tên đã cho có khớp với thứ gì đó không. Cú pháp đầy đủ.

$foo =~ m
291

#
$foo =~ m
292
$foo =~ m
293
$foo =~ m
798
$foo =~ m
295
$foo =~ m
296 biến thể]. Cú pháp đầy đủ.
$foo =~ m
297

#____3298

Coi giá trị trả về của khối mã là điều kiện. Cú pháp đầy đủ.

$foo =~ m
299

#____3283

Kiểm tra xem biểu thức đã được đánh giá bên trong đệ quy chưa. Cú pháp đầy đủ.

$foo =~ m
401

#____5402
$foo =~ m
403

Kiểm tra xem biểu thức đã được đánh giá chưa trong khi thực thi trực tiếp bên trong nhóm chụp thứ n. Kiểm tra này là regex tương đương với

$foo =~ m
45

Nói cách khác, nó không kiểm tra toàn bộ ngăn xếp đệ quy

Cú pháp đầy đủ.

$foo =~ m
404

#
$foo =~ m
405

Tương tự như

$foo =~ m
402, vị từ này kiểm tra xem liệu chúng ta có đang thực thi trực tiếp bên trong nhóm ngoài cùng bên trái với một tên đã cho hay không [đây là logic tương tự được sử dụng bởi
$foo =~ m
276 để phân biệt]. Nó không kiểm tra toàn bộ ngăn xếp mà chỉ kiểm tra tên của đệ quy hoạt động trong cùng. Cú pháp đầy đủ.
$foo =~ m
408

#
$foo =~ m
409

Trong trường hợp này, mẫu có không bao giờ được thực thi trực tiếp và không có mẫu nào được phép. Tinh thần tương tự như

$foo =~ m
410 nhưng hiệu quả hơn. Xem bên dưới để biết chi tiết. Cú pháp đầy đủ.
$foo =~ m
411

$foo =~ m
099
$foo =~ m
416#
$foo =~ m
417

Một biểu thức con "độc lập", một biểu thức khớp với chuỗi con mà một mẫu độc lập sẽ khớp nếu được neo tại vị trí nhất định và nó không khớp với bất kỳ thứ gì khác ngoài chuỗi con này. Cấu trúc này hữu ích cho việc tối ưu hóa những gì nếu không sẽ là kết quả phù hợp "vĩnh cửu", bởi vì nó sẽ không quay lui [xem "Quay lui"]. Nó cũng có thể hữu ích ở những nơi mà ngữ nghĩa "lấy tất cả những gì bạn có thể và không trả lại bất cứ thứ gì" là mong muốn

Ví dụ.

$foo =~ m
418 sẽ không bao giờ khớp, vì
$foo =~ m
419 [được neo ở đầu chuỗi, như trên] sẽ khớp với tất cả các ký tự
$foo =~ m
806 ở đầu chuỗi, không để lại
$foo =~ m
806 cho
$foo =~ m
422 khớp. Ngược lại,
$foo =~ m
423 sẽ khớp giống như
$foo =~ m
424, vì khớp của nhóm con
$foo =~ m
425 bị ảnh hưởng bởi nhóm sau
$foo =~ m
422 [xem "Quay ngược"]. Cụ thể,
$foo =~ m
425 bên trong
$foo =~ m
423 sẽ khớp với ít ký tự hơn so với một
$foo =~ m
425 độc lập, vì điều này làm cho phần đuôi khớp với nhau

$foo =~ m
430 không tắt hoàn toàn tính năng quay lui sau khi đã khớp. Vẫn có thể quay lại cấu trúc, nhưng không thể quay lại cấu trúc đó. Vì vậy,
$foo =~ m
431 sẽ vẫn khớp với "thanh"

Một hiệu ứng tương tự như

$foo =~ m
430 có thể đạt được bằng cách viết
$foo =~ m
433. Điều này khớp với cùng một chuỗi con như một
$foo =~ m
434 độc lập và sau đó
$foo =~ m
888 ăn chuỗi đã khớp; . [Sự khác biệt giữa hai cấu trúc này là cấu trúc thứ hai sử dụng nhóm bắt giữ, do đó thay đổi thứ tự phản hồi trong phần còn lại của biểu thức chính quy. ]

Hãy xem xét mô hình này

$foo =~ m
49

Điều đó sẽ khớp một cách hiệu quả một nhóm không trống với các dấu ngoặc đơn phù hợp sâu từ hai cấp độ trở xuống. Tuy nhiên, nếu không có nhóm như vậy, nó sẽ mất hầu như mãi mãi trên một chuỗi dài. Đó là bởi vì có rất nhiều cách khác nhau để chia một chuỗi dài thành nhiều chuỗi con. Đây là những gì

$foo =~ m
437 đang làm và
$foo =~ m
437 tương tự như một mẫu con của mẫu trên. Xem xét cách mẫu ở trên phát hiện không khớp trên
$foo =~ m
439 trong vài giây, nhưng lần này mỗi chữ cái thừa sẽ tăng gấp đôi. Hiệu suất theo cấp số nhân này sẽ làm cho chương trình của bạn bị treo. Tuy nhiên, một thay đổi nhỏ đối với mô hình này

$foo =~ m/abc/
20

cái nào sử dụng

$foo =~ m
436 khớp chính xác với cái ở trên [tự mình xác minh điều này sẽ là một bài tập hiệu quả], nhưng kết thúc ở vị trí thứ tư khi được sử dụng trên một chuỗi tương tự với 1000000
$foo =~ m
806s. Tuy nhiên, hãy lưu ý rằng, khi cấu trúc này được theo sau bởi một bộ định lượng, nó hiện đang kích hoạt một thông báo cảnh báo bên dưới khóa chuyển đổi pragma hoặc -w
$foo =~ m
735 cho biết nó là
$foo =~ m
443

Trên các nhóm đơn giản, chẳng hạn như mẫu

$foo =~ m
444, có thể đạt được hiệu quả tương đương bằng cách nhìn trước tiêu cực, như trong
$foo =~ m
445. Điều này chỉ chậm hơn 4 lần trên một chuỗi có 1000000
$foo =~ m
806s

Ngữ nghĩa "lấy tất cả những gì bạn có thể và không trả lại bất cứ thứ gì" được mong muốn trong nhiều tình huống mà ngay từ cái nhìn đầu tiên, một

$foo =~ m
447 đơn giản có vẻ như là giải pháp chính xác. Giả sử chúng tôi phân tích cú pháp văn bản với các nhận xét được phân tách bằng
$foo =~ m
183, theo sau là một số khoảng trắng [ngang] tùy chọn. Trái ngược với vẻ ngoài của nó,
$foo =~ m
449 không phải là biểu thức con chính xác để khớp với dấu phân cách nhận xét, vì nó có thể "bỏ" một số khoảng trắng nếu phần còn lại của mẫu có thể khớp theo cách đó. Câu trả lời đúng là một trong hai

$foo =~ m/abc/
21

Ví dụ: để lấy các nhận xét không trống vào

$foo =~ m
171, người dùng nên sử dụng một trong hai

$foo =~ m/abc/
22

Bạn chọn cái nào tùy thuộc vào cách diễn đạt nào phản ánh tốt hơn đặc điểm nhận xét ở trên

Trong một số tài liệu, cấu trúc này được gọi là "khớp nguyên tử" hoặc "khớp sở hữu"

Lượng từ sở hữu tương đương với việc đặt đối tượng mà chúng được áp dụng vào bên trong một trong các cấu trúc này. Các tương đương sau áp dụng

$foo =~ m/abc/
23

Các cấu trúc

$foo =~ m
436 lồng nhau không phải là không hoạt động, ngay cả khi thoạt nhìn chúng có vẻ như. Điều này là do
$foo =~ m
436 lồng nhau có thể hạn chế quay lui nội bộ có thể xảy ra. Ví dụ,

$foo =~ m/abc/
24

phù hợp, nhưng

$foo =~ m/abc/
25

không làm

#
$foo =~ m
453

Xem "Các lớp nhân vật được mở rộng" trong perlrecharclass

$foo =~ m
100
$foo =~ m
083 khớp với ranh giới giữa ký tự khoảng trắng và ký tự không phải khoảng trắng. Lưu ý rằng
$foo =~ m
084 ở vị trí của phiên bản phức tạp hơn. Chúng tôi có thể tạo một mô-đun
$foo =~ m
085 để làm điều này

$foo =~ m
086 cho phép lối thoát mới trong các biểu thức chính quy không đổi, i. e. , những cái không có bất kỳ phép nội suy biến thời gian chạy nào. Như được ghi lại trong tình trạng quá tải, chuyển đổi này sẽ chỉ hoạt động trên các phần chữ của biểu thức chính quy. Đối với
$foo =~ m
087, phần biến của biểu thức chính quy này cần được chuyển đổi rõ ràng [nhưng chỉ khi ý nghĩa đặc biệt của
$foo =~ m
088 phải được bật bên trong
$foo =~ m
089]

$foo =~ m
41

# Tần suất thực thi mã nhúng

Các quy tắc chính xác về tần suất

$foo =~ m
898 và
$foo =~ m/abc/
270 được thực thi trong một mẫu không được chỉ định. Trong trường hợp khớp thành công, bạn có thể cho rằng chúng DWIM và sẽ được thực thi theo thứ tự từ trái sang phải với số lần thích hợp trong đường dẫn chấp nhận của mẫu giống như bất kỳ siêu mẫu nào khác. Các đường dẫn không chấp nhận và lỗi so khớp ảnh hưởng như thế nào đến số lần một mẫu được thực thi không được chỉ định cụ thể và có thể khác nhau tùy thuộc vào những gì tối ưu hóa có thể được áp dụng cho mẫu và có khả năng thay đổi từ phiên bản này sang phiên bản khác

Ví dụ trong

$foo =~ m
42

số lần chính xác "a" hoặc "b" được in ra không được chỉ định cho lỗi, nhưng bạn có thể cho rằng chúng sẽ được in ít nhất một lần trong khi khớp thành công, ngoài ra, bạn có thể cho rằng nếu "b" được in, nó sẽ

Trong trường hợp cấu trúc phân nhánh như sau

$foo =~ m
43

bạn có thể cho rằng đầu vào "ac" sẽ xuất ra "ac" và "abc" sẽ chỉ xuất ra "c"

Khi mã nhúng được định lượng, các kết quả phù hợp thành công sẽ gọi mã một lần cho mỗi lần lặp lại đối sánh của bộ định lượng. Ví dụ

$foo =~ m
44

sẽ xuất ra "o" hai lần

#PCRE/Hỗ trợ Python

Kể từ Perl 5. 10. 0, Perl hỗ trợ một số phần mở rộng dành riêng cho Python/PCRE cho cú pháp regex. Mặc dù các lập trình viên Perl được khuyến khích sử dụng cú pháp dành riêng cho Perl, nhưng những điều sau đây cũng được chấp nhận

#____3228

Xác định một nhóm chụp được đặt tên. Tương đương với

$foo =~ m
223

#____3235

Tham chiếu ngược đến một nhóm chụp được đặt tên. Tương đương với

$foo =~ m
216

#____3278

Cuộc gọi chương trình con đến một nhóm chụp được đặt tên. Tương đương với

$foo =~ m
276

Có một số vấn đề liên quan đến khớp không phân biệt chữ hoa chữ thường trong các quy tắc Unicode. Xem

$foo =~ m
098 bên dưới "Công cụ sửa đổi" ở trên

Tài liệu này thay đổi từ khó hiểu đến hoàn toàn và hoàn toàn không rõ ràng. Văn xuôi lang thang có nhiều biệt ngữ khó hiểu ở một số chỗ

Tài liệu này cần viết lại để tách nội dung hướng dẫn khỏi nội dung tham khảo

Cú pháp của các mẫu được sử dụng trong khớp mẫu Perl phát triển từ các mẫu được cung cấp trong các thói quen biểu thức chính quy của Bell Labs Research Unix Phiên bản thứ 8 [Phiên bản 8]. [Mã này thực sự bắt nguồn [xa] từ việc thực hiện lại các quy trình V8 có thể phân phối lại tự do của Henry Spencer. ]

$_ nghĩa là gì trong Perl?

$_ - Không gian tìm kiếm mẫu và đầu vào mặc định . @_ - Trong một chương trình con, mảng @_ chứa các tham số được truyền cho chương trình con đó. $" - Khi một mảng hoặc một lát mảng được nội suy thành một chuỗi trích dẫn kép hoặc một ngữ cảnh tương tự như /. / , các phần tử của nó được phân tách bằng giá trị này.

Làm cách nào để sử dụng lệnh tr trong Perl?

Toán tử tr trong Perl dịch tất cả các ký tự của Danh sách tìm kiếm thành các ký tự tương ứng của Danh sách thay thế . Ở đây Danh sách tìm kiếm là các ký tự đầu vào đã cho sẽ được chuyển đổi thành các ký tự tương ứng được cung cấp trong Danh sách thay thế.

Chủ Đề