Đây là lệnh perlrebackslash có thể chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình mô phỏng trực tuyến MAC OS
CHƯƠNG TRÌNH:
TÊN
perlrebackslash - Biểu thức chính quy Perl Dấu gạch chéo ngược chuỗi và thoát
MÔ TẢ
Tài liệu cấp cao nhất về biểu thức chính quy Perl được tìm thấy trong perlre.
Tài liệu này mô tả tất cả các dấu gạch chéo ngược và chuỗi thoát. Sau khi giải thích vai trò của
dấu gạch chéo ngược, nó liệt kê tất cả các chuỗi có ý nghĩa đặc biệt trong Perl thường
các biểu thức (theo thứ tự bảng chữ cái), sau đó mô tả từng biểu thức.
Hầu hết các trình tự được mô tả chi tiết trong các tài liệu khác nhau; mục đích chính của việc này
tài liệu là có một hướng dẫn tham khảo nhanh chóng mô tả tất cả các dấu gạch chéo ngược và chuỗi thoát.
dấu gạch chéo ngược
Trong một biểu thức chính quy, dấu gạch chéo ngược có thể thực hiện một trong hai tác vụ: nó loại bỏ
ý nghĩa đặc biệt của ký tự theo sau nó (ví dụ: "\ |" khớp với một hàng dọc
thanh, nó không phải là sự thay thế), hoặc nó là phần bắt đầu của một dấu gạch chéo ngược hoặc chuỗi thoát.
Các quy tắc xác định nó là gì khá đơn giản: nếu ký tự theo sau
dấu gạch chéo ngược là một ký tự dấu câu (không phải từ) ASCII (nghĩa là bất kỳ ký tự nào không phải là
chữ cái, chữ số hoặc dấu gạch dưới), thì dấu gạch chéo ngược chỉ lấy đi bất kỳ ý nghĩa đặc biệt nào của
nhân vật theo sau nó.
Nếu ký tự theo sau dấu gạch chéo ngược là một chữ cái ASCII hoặc một chữ số ASCII, thì
trình tự có thể đặc biệt; nếu vậy, nó được liệt kê bên dưới. Một số chữ cái vẫn chưa được sử dụng,
vì vậy việc thoát chúng bằng dấu gạch chéo ngược không làm thay đổi chúng trở nên đặc biệt. Một phiên bản tương lai của
Perl có thể gán một ý nghĩa đặc biệt cho chúng, vì vậy nếu bạn đã bật cảnh báo, thì Perl sẽ gặp sự cố
một cảnh báo nếu bạn sử dụng một trình tự như vậy. [1].
Tuy nhiên, nó được đảm bảo rằng các chuỗi ký tự gạch chéo ngược hoặc thoát không bao giờ có dấu chấm câu
ký tự theo sau dấu gạch chéo ngược, không phải bây giờ và không phải trong phiên bản tương lai của Perl 5. Vì vậy, nó
là an toàn để đặt dấu gạch chéo ngược trước một ký tự không phải từ.
Lưu ý rằng bản thân dấu gạch chéo ngược là đặc biệt; nếu bạn muốn khớp với một dấu gạch chéo ngược, bạn phải
thoát khỏi dấu gạch chéo ngược bằng dấu gạch chéo ngược: "/ \\ /" khớp với một dấu gạch chéo ngược.
[1] Có một ngoại lệ. Nếu bạn sử dụng một ký tự chữ và số làm dấu phân cách của
(mà bạn có thể không nên làm vì lý do dễ đọc), bạn phải thoát
dấu phân cách nếu bạn muốn khớp với nó. Perl sẽ không cảnh báo sau đó. Xem thêm "Gory chi tiết của
phân tích cú pháp các cấu trúc được trích dẫn "trong perlop.
Tất cả các trình tự và trốn thoát
Những ký tự không thể sử dụng được trong một lớp ký tự được đặt trong ngoặc vuông (như "[\ da-z]") được đánh dấu là "Không có trong
[]. "
\ 000 Chuỗi thoát bát phân. Xem thêm \ o {}.
\ 1 Tỷ lệ ủng hộ tuyệt đối. Không có trong [].
\ a Báo thức hoặc chuông.
\ A Bắt đầu của chuỗi. Không có trong [].
\ b {}, \ b Ranh giới. (\ b là khoảng trắng lùi trong []).
\ B {}, \ B Không phải là ranh giới. Không có trong [].
\ cX Control-X.
\ C Một octet, thậm chí dưới UTF-8. Không có trong [].
(Không được dùng nữa)
\ d Lớp ký tự cho các chữ số.
\ D Lớp ký tự cho các chữ số không.
\ e Escape ký tự.
\ E Tắt xử lý \ Q, \ L và \ U. Không có trong [].
\ f Nguồn cấp dữ liệu biểu mẫu.
\ F Thư mục cho đến \ E. Không có trong [].
\ g {}, \ g1 Tham chiếu ngược được đặt tên, tuyệt đối hoặc tương đối.
Không có trong [].
\ G khẳng định vị trí. Không có trong [].
\ h Lớp ký tự cho khoảng trắng ngang.
\ H Lớp ký tự cho khoảng trắng không nằm ngang.
\ k {}, \ k <>, \ k '' Tham khảo sau được đặt tên. Không có trong [].
\ K Giữ những thứ còn lại của \ K. Không có trong [].
\ l Ký tự tiếp theo viết thường. Không có trong [].
\ L Chữ thường cho đến \ E. Không có trong [].
\ n (Hợp lý) ký tự dòng mới.
\ N Bất kỳ ký tự nào trừ dòng mới. Không có trong [].
\ N {} Ký tự hoặc chuỗi được đặt tên hoặc đánh số (Unicode).
\ o {} Chuỗi thoát bát phân.
\ p {}, \ pP Ký tự với thuộc tính Unicode đã cho.
\ P {}, \ PP Ký tự không có thuộc tính Unicode đã cho.
\ Q Trích dẫn (vô hiệu hóa) siêu ký tự mẫu cho đến \ E. Không
trong [].
\ r Trả về ký tự.
\ R Dòng mới chung. Không có trong [].
\ s Lớp ký tự cho khoảng trắng.
\ S Lớp ký tự không có khoảng trắng.
\ t Ký tự tab.
\ u Ký tự tiếp theo viết hoa tiêu đề. Không có trong [].
\ U Viết hoa cho đến \ E. Không có trong [].
\ v Lớp ký tự cho khoảng trắng dọc.
\ V Lớp ký tự cho khoảng trắng không theo chiều dọc.
\ w Lớp ký tự cho các ký tự từ.
\ W Lớp ký tự cho các ký tự không phải từ.
\ x {}, \ x00 Chuỗi thoát thập lục phân.
\ X Unicode "cụm grapheme mở rộng". Không có trong [].
\ z Cuối chuỗi. Không có trong [].
\ Z Cuối chuỗi. Không có trong [].
Nhân vật Thoát hiểm
đã sửa nhân vật
Một số ít các nhân vật có một tính cách thoát. Bảng sau đây cho thấy chúng,
cùng với các điểm mã ASCII của chúng (ở dạng thập phân và hex), tên ASCII của chúng, điều khiển
thoát trên nền tảng ASCII và một mô tả ngắn. (Đối với nền tảng EBCDIC, hãy xem "OPERATOR
SỰ KHÁC BIỆT "trong perlebcdic.)
Quy trình Mã điểm ASCII Cntrl Mô tả.
Tháng mười hai Hex
\ a 7 07 BEL \ cG báo thức hoặc chuông
\ b 8 08 BS \ cH backspace [1]
\ e 27 1B ESC \ c [ký tự thoát
\ f 12 0C FF \ cL nguồn cấp dữ liệu biểu mẫu
\ n 10 0A nguồn cấp dữ liệu dòng LF \ cJ [2]
\ r 13 0D CR \ cM xuống dòng
\ t 9 09 TAB \ cI tab
[1] "\ b" là ký tự xóa lùi chỉ bên trong một lớp ký tự. Bên ngoài một nhân vật
lớp, riêng "\ b" là ranh giới từ-ký tự / không phải từ-ký tự và "\ b {}" là một số
loại ranh giới khác.
[2] "\ n" khớp với một dòng mới hợp lý. Perl chuyển đổi giữa "\ n" và hệ điều hành gốc của bạn
ký tự dòng mới khi đọc từ hoặc ghi vào tệp văn bản.
Ví dụ
$ str = ~ / \ t /; # Đối sánh nếu $ str chứa một tab (ngang).
Kiểm soát nhân vật
"\ c" được sử dụng để biểu thị một ký tự điều khiển; ký tự theo sau "\ c" xác định
giá trị của cấu trúc. Ví dụ: giá trị của "\ cA" là chr(1) và giá trị của "\ cb"
is chr(2), v.v. Các chi tiết đẫm máu có trong "Regexp Quote-Like Operators" trong perlop. MỘT
danh sách đầy đủ những gì chr(1), v.v. nghĩa là đối với các nền tảng ASCII và EBCDIC nằm trong "OPERATOR
SỰ KHÁC BIỆT "trong perlebcdic.
Lưu ý rằng chỉ riêng "\ c \" ở cuối biểu thức chính quy (hoặc chuỗi được trích dẫn kép) thì không
có giá trị. Dấu gạch chéo ngược phải được theo sau bởi một ký tự khác. Đó là, "\ cX" có nghĩa
"chr(28). 'X '" cho tất cả các ký tự X.
Để viết mã độc lập với nền tảng, bạn phải sử dụng "\ N {TÊN}" thay vào đó, như "\ N {ESCAPE}" hoặc
"\ N {U + 001B}", xem các tên.
Ghi nhớ: cnhân vật ontrol.
Ví dụ
$ str = ~ / \ cK /; # Đối sánh nếu $ str chứa một tab dọc (control-K).
Được đặt theo tên or đánh số nhân vật và tính cách trình tự
Các ký tự Unicode có tên Unicode và giá trị mã số (thứ tự). Sử dụng
Cấu trúc "\ N {}" để chỉ định một ký tự theo một trong hai giá trị này. Các chuỗi nhất định của
nhân vật cũng có tên.
Để chỉ định theo tên, tên của ký tự hoặc chuỗi ký tự nằm giữa dấu ngoặc
niềng răng.
Để chỉ định một ký tự theo điểm mã Unicode, hãy sử dụng biểu mẫu "\ N {U +mã điểm}", Nơi mã
điểm là một số ở hệ thập lục phân cung cấp điểm mã mà Unicode đã gán cho
ký tự mong muốn. Thông thường, nhưng không bắt buộc phải sử dụng các số XNUMX ở đầu để đệm
số đến 4 chữ số. Do đó, "\ N {U + 0041}" có nghĩa là "CHỮ VIẾT HOA CHỮ A", và bạn sẽ hiếm khi
thấy nó được viết mà không có hai số 0041 ở đầu. "\ N {U + XNUMX}" có nghĩa là "A" ngay cả trên EBCDIC
máy (trong đó giá trị thứ tự của "A" không phải là 0x41).
Thậm chí có thể đặt tên riêng của bạn cho các ký tự và chuỗi ký tự. Vì
thông tin chi tiết, xem các charnames.
(Có một biểu mẫu nội bộ mở rộng mà bạn có thể thấy trong đầu ra gỡ lỗi: "\ N {U +mã
điểm.mã điểm...}". "..." có nghĩa là bất kỳ số nào trong số này mã điểms cách nhau bởi dấu chấm.
Điều này đại diện cho trình tự được hình thành bởi các ký tự. Đây chỉ là biểu mẫu nội bộ,
có thể thay đổi và bạn không nên tự mình sử dụng nó.)
Ghi nhớ: Nnhân vật theo chủ đề.
Lưu ý rằng một ký tự hoặc chuỗi ký tự được biểu thị dưới dạng ký tự được đặt tên hoặc đánh số là
được công cụ regex coi là một ký tự không có ý nghĩa đặc biệt và sẽ khớp với "as
Là".
Ví dụ
$ str = ~ / \ N {KÝ TỰ THÁI VẬY} /; # Khớp với ký tự SO SO trong tiếng Thái
sử dụng các ký tự 'Cyrillic'; # Tải tên Kirin.
$ str = ~ / \ N {ZHE} \ N {KA} /; # Khớp "ZHE" theo sau là "KA".
Octal trốn thoát
Có hai dạng thoát bát phân. Mỗi được sử dụng để chỉ định một ký tự bằng mã của nó
điểm được chỉ định trong ký hiệu bát phân.
Một biểu mẫu, có sẵn bắt đầu từ Perl 5.14 trông giống như "\ o {...}", trong đó các dấu chấm biểu thị
một hoặc nhiều chữ số bát phân. Nó có thể được sử dụng cho bất kỳ ký tự Unicode nào.
Nó được giới thiệu để tránh các vấn đề tiềm ẩn với biểu mẫu khác, có sẵn trong tất cả
Perls. Dạng đó bao gồm một dấu gạch chéo ngược theo sau là ba chữ số bát phân. Một vấn đề
với biểu mẫu này là nó có thể trông giống hệt như một backreference kiểu cũ (xem
"Quy tắc phân định định vị giữa thoát bát phân kiểu cũ và tham chiếu ngược" bên dưới.) Bạn có thể
tránh điều này bằng cách đặt chữ số đầu tiên trong số ba chữ số luôn là số 077, nhưng điều đó làm cho \ XNUMX trở thành
điểm mã lớn nhất có thể xác định được.
Trong một số ngữ cảnh, dấu gạch chéo ngược theo sau là hai hoặc thậm chí một chữ số bát phân có thể được hiểu
như một lối thoát bát phân, đôi khi có cảnh báo và do một số lỗi, đôi khi với
những kết quả bất ngờ. Ngoài ra, nếu bạn đang tạo regex từ các đoạn mã nhỏ hơn
được nối với nhau và bạn sử dụng ít hơn ba chữ số, phần đầu của một đoạn mã
có thể được hiểu là thêm các chữ số vào phần cuối của đoạn mã trước nó. Xem "Tuyệt đối
tham khảo "để có thêm thảo luận và các ví dụ về vấn đề đoạn mã.
Lưu ý rằng một ký tự được biểu thị dưới dạng thoát bát phân được coi là ký tự không có
ý nghĩa đặc biệt của công cụ regex và sẽ khớp với "nguyên trạng".
Tóm lại, biểu mẫu "\ o {}" luôn an toàn để sử dụng và biểu mẫu khác an toàn để sử dụng cho
mã trỏ qua \ 077 khi bạn sử dụng chính xác ba chữ số để chỉ định chúng.
Ghi nhớ: 0ctal hoặc okim loại.
Ví dụ (giả sử một nền tảng ASCII)
$ str = "Perl";
$ str = ~ / \ o {120} /; # Đối sánh, "\ 120" là "P".
$ str = ~ / \ 120 /; # Tương tự.
$ str = ~ / \ o {120} + /; # Khớp, "\ 120" là "P",
# nó lặp lại ít nhất một lần.
$ str = ~ / \ 120 + /; # Tương tự.
$ str = ~ / P \ 053 /; # Không khớp, "\ 053" là "+" và được hiểu theo nghĩa đen.
/ \ o {23073} / # Nền trước màu đen, nền trắng hình mặt cười.
/ \ o {4801234567} / # Tăng cảnh báo và đưa ra kết quả chr(4).
Quy tắc phân định giữa các thoát bát phân kiểu cũ và truy xuất ngược
Hệ bát phân thoát ra khỏi dạng "\ 000" bên ngoài các lớp ký tự trong ngoặc vuông có khả năng xảy ra xung đột
với tham chiếu ngược kiểu cũ (xem "Tham chiếu tuyệt đối" bên dưới). Cả hai đều bao gồm một
dấu gạch chéo ngược theo sau là số. Vì vậy, Perl phải sử dụng phương pháp heuristics để xác định xem nó có phải là
backreference hoặc một lối thoát bát phân. Perl sử dụng các quy tắc sau để phân biệt:
1. Nếu dấu gạch chéo ngược được theo sau bởi một chữ số, thì đó là một dấu gạch chéo ngược.
2. Nếu chữ số đầu tiên theo sau dấu gạch chéo ngược là 0, thì đó là một số thoát bát phân.
3. Nếu số theo sau dấu gạch chéo ngược là N (ở dạng thập phân) và Perl đã nhìn thấy N
các nhóm nắm bắt, Perl coi đây là một phản hồi. Nếu không, nó coi nó là một
thoát bát phân. Nếu N có nhiều hơn ba chữ số, Perl chỉ lấy ba chữ số đầu tiên cho
thoát bát phân; phần còn lại được khớp nguyên trạng.
$ pat = "(" x 999;
$ pat. = "a";
$ pat. = ")" x 999;
/ ^ ($ vỗ) \ 1000 $ /; # Đối sánh 'aa'; có 1000 nhóm chụp.
/ ^ $ pat \ 1000 $ /; # Đối sánh 'a @ 0'; có 999 nhóm chụp
# và \ 1000 được coi là \ 100 (a '@') và '0'.
Bạn luôn có thể buộc diễn giải tham chiếu ngược bằng cách sử dụng biểu mẫu "\ g {...}". Bạn có thể
buộc phải giải thích luôn theo hệ bát phân bằng cách sử dụng dạng "\ o {...}" hoặc đối với các số
đến \ 077 (= 63 thập phân), bằng cách sử dụng ba chữ số, bắt đầu bằng "0".
Hexadecimal trốn thoát
Giống như thoát bát phân, có hai dạng thoát thập lục phân, nhưng cả hai đều bắt đầu bằng
dãy "\ x". Tiếp theo là chính xác hai chữ số thập lục phân tạo thành một
số hoặc một số thập lục phân có độ dài tùy ý được bao quanh bởi dấu ngoặc nhọn. Các
số thập lục phân là điểm mã của ký tự bạn muốn diễn đạt.
Lưu ý rằng một nhân vật được thể hiện là một trong những lần trốn thoát này được coi là một nhân vật không có
ý nghĩa đặc biệt của công cụ regex và sẽ khớp với "nguyên trạng".
Ghi nhớ: anh ấyxthập phân.
Ví dụ (giả sử một nền tảng ASCII)
$ str = "Perl";
$ str = ~ / \ x50 /; # Đối sánh, "\ x50" là "P".
$ str = ~ / \ x50 + /; # Khớp, "\ x50" là "P", nó được lặp lại ít nhất một lần
$ str = ~ / P \ x2B /; # Không trùng khớp, "\ x2B" là "+" và được hiểu theo nghĩa đen.
/ \ x {2603} \ x {2602} / # Người tuyết cầm ô.
# Ký tự Unicode 2603 là người tuyết,
# ký tự Unicode 2602 là một ô.
/ \ x {263B} / # Mặt cười đen.
/ \ x {263b} / # Tương tự, các chữ số thập lục phân A - F không phân biệt chữ hoa chữ thường.
Bổ ngữ
Một số chuỗi dấu gạch chéo ngược liên quan đến việc thay đổi ký tự hoặc các ký tự
theo dõi họ. "\ l" sẽ viết thường ký tự theo sau nó, trong khi "\ u" sẽ viết hoa
(hay chính xác hơn là viết hoa tiêu đề) ký tự theo sau nó. Họ cung cấp chức năng
tương tự với các chức năng "lcfirst" và "ucfirst".
Để viết hoa hoặc viết thường một số ký tự, người ta có thể muốn sử dụng "\ L" hoặc "\ U",
sẽ viết thường / viết hoa tất cả các ký tự theo sau chúng, cho đến khi kết thúc
hoặc lần xuất hiện tiếp theo của "\ E", tùy điều kiện nào đến trước. Họ cung cấp chức năng
tương tự như những gì các hàm "lc" và "uc" cung cấp.
"\ Q" được sử dụng để trích dẫn (vô hiệu hóa) các siêu ký tự mẫu, cho đến "\ E" tiếp theo hoặc phần cuối của
mô hình. "\ Q" thêm dấu gạch chéo ngược vào bất kỳ ký tự nào có thể có ý nghĩa đặc biệt đối với
Perl. Trong phạm vi ASCII, nó trích dẫn mọi ký tự không phải là chữ cái, chữ số hoặc
gạch dưới. Xem "quotemeta" trong perlfunc để biết chi tiết về những gì được trích dẫn cho không phải ASCII
điểm mã. Sử dụng điều này đảm bảo rằng bất kỳ ký tự nào giữa "\ Q" và "\ E" sẽ được khớp
theo nghĩa đen, không được công cụ regex hiểu là một siêu ký tự.
"\ F" có thể được sử dụng để viết hoa tất cả các ký tự theo sau, cho đến "\ E" tiếp theo hoặc cuối của
mô hình. Nó cung cấp chức năng tương tự như chức năng "fc".
Ghi nhớ: Lchữ cái, Uchữ hoa, Ftrường hợp cũ, Quotemeta, Ethứ
Các ví dụ
$ sid = "sid";
$ greg = "GrEg";
$ miranda = "(Miranda)";
$ str = ~ / \ u $ sid /; # Đối sánh 'Sid'
$ str = ~ / \ L $ greg /; # Đối sánh 'greg'
$ str = ~ / \ Q $ miranda \ E /; # Khớp '(Miranda)', như thể kiểu
# đã được viết là / \ (Miranda \) /
Nhân vật các lớp học
Biểu thức chính quy Perl có một loạt các lớp ký tự. Một số nhân vật
các lớp được viết dưới dạng một chuỗi dấu gạch chéo ngược. Chúng tôi sẽ thảo luận ngắn gọn về những điều đó ở đây; đầy
thông tin chi tiết của các lớp nhân vật có thể được tìm thấy trong perlrecharclass.
"\ w" là một lớp ký tự phù hợp với bất kỳ lời ký tự (chữ cái, chữ số, Unicode
dấu và dấu chấm câu kết nối (như dấu gạch dưới)). "\ d" là một lớp ký tự
khớp với bất kỳ chữ số thập phân nào, trong khi lớp ký tự "\ s" khớp với bất kỳ khoảng trắng nào
nhân vật. Điểm mới trong perl 5.10.0 là các lớp "\ h" và "\ v" khớp theo chiều ngang và
ký tự khoảng trắng dọc.
Bộ ký tự chính xác được so khớp bởi "\ d", "\ s" và "\ w" khác nhau tùy thuộc vào
pragma và công cụ sửa đổi biểu thức chính quy. Có thể giới hạn trận đấu ở
Phạm vi ASCII bằng cách sử dụng công cụ sửa đổi biểu thức chính quy "/ a". Xem perlrecharclass.
Các biến thể chữ hoa ("\ W", "\ D", "\ S", "\ H" và "\ V") là các lớp ký tự
đối sánh tương ứng với bất kỳ ký tự nào không phải là ký tự từ, chữ số, khoảng trắng,
khoảng trắng ngang hoặc khoảng trắng dọc.
Thuật nhớ: wthứ tự, dbắt đầu, stốc độ, htheo chiều ngang, vsai lầm.
Unicode các lớp học
"\ pP" (trong đó "P" là một chữ cái) và "\ p {Thuộc tính}" được sử dụng để khớp với một ký tự
khớp với thuộc tính Unicode đã cho; thuộc tính bao gồm những thứ như "letter" hoặc "thai
ký tự ". Viết hoa chuỗi thành" \ PP "và" \ P {Thuộc tính} "làm cho chuỗi khớp với
một ký tự không khớp với thuộc tính Unicode đã cho. Để biết thêm chi tiết, hãy xem
"Chuỗi dấu gạch chéo ngược" trong lớp perlrechar và "Thuộc tính ký tự Unicode" trong
perlunicode.
Ghi nhớ: ptài sản.
Tham khảo
Nếu sử dụng dấu ngoặc đơn trong một biểu thức chính quy, chúng ta có thể tham khảo phần
chuỗi nguồn được khớp và khớp chính xác với cùng một thứ. Có ba cách
đề cập đến như vậy sự ủng hộ: hoàn toàn, tương đối, và theo tên.
Tuyệt đối tham khảo
Hoặc "\ gN" (bắt đầu trong Perl 5.10.0), hoặc "N" (kiểu cũ) ở đâu N là một tích cực
(không dấu) số thập phân có độ dài bất kỳ là một tham chiếu tuyệt đối đến một nhóm thu thập.
N đề cập đến bộ dấu ngoặc thứ N, vì vậy "\ gN" đề cập đến bất cứ điều gì đã được so khớp bởi
tập hợp các dấu ngoặc đơn đó. Do đó "\ g1" đề cập đến nhóm chụp đầu tiên trong regex.
Dấu "\ gN" biểu mẫu có thể được viết tương đương là "\ g {N}" giúp tránh sự mơ hồ khi xây dựng
một regex bằng cách nối các chuỗi ngắn hơn. Ngược lại, nếu bạn có regex "qr / $ a $ b /" và $ a
chứa "\ g1" và $ b chứa "37", bạn sẽ nhận được "/ \ g137 /" có thể không phải là
bạn dự định.
Bên trong "N" hình thức, N không được bắt đầu bằng "0" và phải có ít nhất N capturing
nhóm, hoặc khác N được coi là một lối thoát bát phân (nhưng một cái gì đó như "\ 18" giống như
"\ 0018"; nghĩa là, thoát bát phân "\ 001" theo sau là một chữ số theo nghĩa đen "8").
Ghi nhớ: gđánh trống lảng.
Các ví dụ
/ (\ w +) \ g1 /; # Tìm một từ trùng lặp, (ví dụ: "cat cat").
/ (\ w +) \ 1 /; # Điều tương tự; viết theo kiểu cũ.
/(.)(.)\g2\g1/; # Ghép một palindrome bốn chữ cái (ví dụ: "ABBA").
Quan hệ tham khảo
"\ g-N" (bắt đầu từ Perl 5.10.0) được sử dụng để định địa chỉ tương đối. (Nó có thể được viết là
"\ g {-N".) Nó đề cập đến Nnhóm thứ trước "\ g {-N}".
Ưu điểm lớn của biểu mẫu này là nó làm cho việc viết các mẫu dễ dàng hơn nhiều với
các tham chiếu có thể được nội suy trong các mẫu lớn hơn, ngay cả khi mẫu lớn hơn cũng
chứa các nhóm chụp.
Các ví dụ
/ (A) # Nhóm 1
(# Nhóm 2
(B) # Nhóm 3
\ g {-1} # Đề cập đến nhóm 3 (B)
\ g {-3} # Đề cập đến nhóm 1 (A)
)
/ x; # Đối sánh "ABBA".
của tôi $ qr = qr /(.)(.)\g{-2}\g{-1}/; # Đối sánh với 'abab', 'cdcd', v.v.
/ $ qr $ qr / # Đối sánh với 'ababcdcd'.
Được đặt theo tên tham khảo
"\ g {Tên}" (bắt đầu từ Perl 5.10.0) có thể được sử dụng để tham chiếu trở lại một nhóm nắm bắt được đặt tên,
pha chế hoàn toàn với việc phải suy nghĩ về việc nắm bắt các vị trí đệm.
Để tương thích với biểu thức chính quy .Net, "\ g {name}" cũng có thể được viết là
"\ k {name}", "\ k "hoặc" \ k'name '".
Để tránh bất kỳ sự mơ hồ nào, tên không được bắt đầu bằng chữ số cũng như không được chứa dấu gạch ngang.
Các ví dụ
/ (? \ w +) \ g {word} / # Tìm từ trùng lặp, (ví dụ: "cat cat")
/ (? \ w +) \ k {word} / # Tương tự.
/ (? \ w +) \ k / # Tương tự.
/ (? .) (? .) \ g {letter1} \ g {letter2} /
# Khớp một palindrome bốn chữ cái (ví dụ: "ABBA")
Khẳng định
Khẳng định là những điều kiện phải đúng; chúng không thực sự khớp với các phần của
chuỗi con. Có sáu khẳng định được viết dưới dạng chuỗi dấu gạch chéo ngược.
\ A "\ A" chỉ khớp ở đầu chuỗi. Nếu công cụ sửa đổi "/ m" không được sử dụng,
thì "/ \ A /" tương đương với "/ ^ /". Tuy nhiên, nếu công cụ sửa đổi "/ m" được sử dụng, thì "/ ^ /"
khớp với các dòng mới nội bộ, nhưng ý nghĩa của "/ \ A /" không bị thay đổi bởi "/ m"
bổ nghĩa. "\ A" khớp ở đầu chuỗi bất kể "/ m"
bổ ngữ được sử dụng.
\ z, \ Z
"\ z" và "\ Z" khớp ở cuối chuỗi. Nếu công cụ sửa đổi "/ m" không được sử dụng, thì
"/ \ Z /" tương đương với "/ $ /"; nghĩa là, nó khớp ở cuối chuỗi hoặc một
trước dòng mới ở cuối chuỗi. Nếu công cụ sửa đổi "/ m" được sử dụng, thì "/ $ /"
khớp ở các dòng mới nội bộ, nhưng ý nghĩa của "/ \ Z /" không bị thay đổi bởi "/ m"
bổ nghĩa. "\ Z" khớp ở cuối chuỗi (hoặc ngay trước dòng mới ở cuối)
bất kể việc bổ nghĩa "/ m" có được sử dụng hay không.
"\ z" cũng giống như "\ Z", ngoại trừ việc nó không khớp trước một dòng mới ở cuối. "\ z"
chỉ so khớp ở cuối chuỗi, bất kể công cụ sửa đổi được sử dụng và không chỉ
trước một dòng mới. Đó là cách neo kết quả phù hợp vào cuối chuỗi thực sự
tất cả các điều kiện.
\ G "\ G" thường chỉ được sử dụng kết hợp với bổ ngữ "/ g". Nếu bổ ngữ "/ g"
được sử dụng và đối sánh được thực hiện trong ngữ cảnh vô hướng, Perl nhớ vị trí trong nguồn
chuỗi trận đấu cuối cùng đã kết thúc và lần tiếp theo, nó sẽ bắt đầu trận đấu từ nơi nó
đã kết thúc thời gian trước đó.
"\ G" khớp với điểm mà trận đấu trước đó trên chuỗi đó đã kết thúc hoặc điểm bắt đầu
của chuỗi đó nếu không có kết quả phù hợp trước đó.
Ghi nhớ: Gthùy.
\ b {}, \ b, \ B {}, \ B
"\ b {...}", có sẵn bắt đầu trong v5.22, khớp với một ranh giới (giữa hai ký tự hoặc
trước ký tự đầu tiên của chuỗi hoặc sau ký tự cuối cùng của chuỗi)
dựa trên các quy tắc Unicode cho kiểu ranh giới được chỉ định bên trong dấu ngoặc nhọn. Các
Các loại ranh giới hiện đã biết được đưa ra một vài đoạn dưới đây. "\ B {...}" phù hợp với
bất kỳ vị trí nào giữa các ký tự mà "\ b {...}" cùng loại không khớp.
"\ b" khi không nằm ngay sau dấu "{" khớp ở bất kỳ vị trí nào giữa một từ
(một cái gì đó được khớp bởi "\ w") và một ký tự không phải từ ("\ W"); "\ B" khi không phải ngay lập tức
theo sau là "{" khớp ở bất kỳ vị trí nào giữa các ký tự mà "\ b" không khớp.
Để so khớp từ tốt hơn với văn bản ngôn ngữ tự nhiên, hãy xem \ b {wb} bên dưới.
"\ b" và "\ B" giả sử có một ký tự không phải từ trước khi bắt đầu và sau dấu
cuối chuỗi nguồn; vì vậy "\ b" sẽ khớp ở đầu (hoặc cuối) của nguồn
chuỗi nếu chuỗi nguồn bắt đầu (hoặc kết thúc) bằng một ký tự từ. Nếu không, "\ B"
sẽ phù hợp.
Không sử dụng một cái gì đó như "\ b = head \ d \ b" và mong đợi nó khớp với phần đầu của a
đường kẻ. Nó không thể, bởi vì có một ranh giới trước không phải từ "=", ở đó
phải là một ký tự từ ngay trước đó. Tất cả ranh giới đơn giản "\ b" và "\ B"
xác định chỉ tìm các ký tự từ, không phải các ký tự không phải từ cũng như
chuỗi kết thúc. Có thể hữu ích khi hiểu cách <\ b> và <\ B> hoạt động bằng cách đánh đồng chúng là
sau:
\ b thực sự có nghĩa là (?: (? <= \ w) (?! \ w) | (?
\ B thực sự có nghĩa là (?: (? <= \ W) (? = \ W) | (?
Ngược lại, "\ b {...}" và "\ B {...}" có thể khớp hoặc không khớp ở đầu và cuối của
dòng, tùy thuộc vào loại ranh giới. Chúng thực hiện mặc định Unicode
ranh giới, được chỉ định tronghttp://www.unicode.org/reports/tr29/>. Các loại ranh giới
hiện có sẵn là:
"\ b {gcb}" hoặc "\ b {g}"
Điều này phù hợp với "Ranh giới cụm đồ thị" Unicode. (Thực ra Perl luôn sử dụng
cụm grapheme "mở rộng" được cải tiến "). Chúng được giải thích bên dưới
"" \ X "". Trên thực tế, "\ X" là một cách khác để có được chức năng tương tự. Nó là
tương đương với "/.+? \ b {gcb} / ". Sử dụng tùy chọn nào thuận tiện nhất cho bạn
tình hình.
"\ b {sb}"
Điều này phù hợp với "Ranh giới câu" Unicode. Đây là một trợ giúp để phân tích cú pháp tự nhiên
câu ngôn ngữ. Nó cho kết quả tốt, nhưng không hoàn hảo. Ví dụ, nó nghĩ
rằng "Mr. Smith" là hai câu. Thông tin chi tiết có tại
<http://www.unicode.org/reports/tr29/>. Cũng lưu ý rằng nó nghĩ rằng bất cứ điều gì
đối sánh "\ R" (ngoại trừ nguồn cấp dữ liệu biểu mẫu và tab dọc) là một ranh giới câu.
"\ b {sb}" hoạt động với văn bản được thiết kế cho trình xử lý văn bản bao gồm các dòng
tự động để hiển thị, nhưng các đường ranh giới được mã hóa cứng được coi là
về cơ bản là phần cuối của các khối văn bản (thực sự là đoạn văn), và do đó phần cuối của
người gửi thư. "\ b {sb}" không hoạt động tốt với văn bản chứa các dòng mới được nhúng, như
văn bản nguồn của tài liệu bạn đang đọc. Văn bản như vậy cần phải được
được xử lý trước để loại bỏ các dấu phân cách trước khi tìm kiếm câu
ranh giới. Một số người coi đây là một lỗi trong tiêu chuẩn Unicode, và điều này
hành vi có thể thay đổi trong các phiên bản Perl trong tương lai.
"\ b {wb}"
Điều này khớp với một Unicode "Word Boundary". Điều này mang lại tốt hơn (mặc dù không hoàn hảo)
kết quả để xử lý ngôn ngữ tự nhiên hơn "\ b" đơn giản (không có dấu ngoặc nhọn).
Ví dụ, nó hiểu rằng dấu nháy đơn có thể ở giữa các từ và
mà không có dấu ngoặc (xem các ví dụ bên dưới). Thông tin chi tiết có tại
<http://www.unicode.org/reports/tr29/>.
Điều quan trọng là nhận ra khi bạn sử dụng các ranh giới Unicode này, bạn đang sử dụng
rủi ro rằng phiên bản Perl trong tương lai có chứa phiên bản Unicode mới hơn
Tiêu chuẩn sẽ không hoạt động chính xác theo cách giống như khi mã của bạn được viết.
Các quy tắc này không được coi là ổn định và có thể thay đổi nhiều hơn
so với phần còn lại của Tiêu chuẩn. Unicode có quyền thay đổi chúng theo ý muốn, và
Perl bảo lưu quyền cập nhật việc triển khai của mình theo các quy tắc mới của Unicode. bên trong
trước đây, một số thay đổi là do các ký tự mới đã được thêm vào Tiêu chuẩn
có các đặc điểm khác với tất cả các ký tự trước đó, vì vậy các quy tắc mới là
công thức để xử lý chúng. Những điều này sẽ không gây ra bất kỳ khả năng tương thích ngược nào
vấn đề. Nhưng một số thay đổi đã thay đổi cách xử lý các ký tự hiện có vì
Ủy ban Kỹ thuật Unicode đã quyết định rằng sự thay đổi được đảm bảo cho bất kỳ điều gì
lý do. Điều này có thể là để sửa một lỗi hoặc vì họ nghĩ rằng sẽ thu được kết quả tốt hơn
với quy tắc mới.
Cũng cần biết rằng đây là những định nghĩa ranh giới mặc định và
triển khai có thể muốn điều chỉnh kết quả cho các mục đích và ngôn ngữ cụ thể.
Unicode xác định loại ranh giới thứ tư, có thể truy cập thông qua Unicode :: LineBreak
mô-đun.
Ghi nhớ: bdồi dào.
Các ví dụ
"con mèo" = ~ / \ Acat /; # Trùng khớp.
"cat" = ~ / cat \ Z /; # Trùng khớp.
"cat \ n" = ~ / cat \ Z /; # Trùng khớp.
"cat \ n" = ~ / cat \ z /; # Không có trận đấu.
"con mèo" = ~ / \ bcat \ b /; # Diêm.
"mèo" = ~ / \ bcat \ b /; # Không có trận đấu.
"con mèo" = ~ / \ bcat \ B /; # Không có trận đấu.
"mèo" = ~ / \ bcat \ B /; # Trùng khớp.
while ("con chó mèo" = ~ / (\ w +) / g) {
in $ 1; # In 'catdog'
}
while ("con chó mèo" = ~ / \ G (\ w +) / g) {
in $ 1; # In 'mèo'
}
my $ s = "Anh ấy nói, \" Có phải pi 3.14 không? (Tôi không chắc).\"";
print join ("|", $ s = ~ m / (. +? \ b) / xg), "\ n";
print join ("|", $ s = ~ m / (. +? \ b {wb}) / xg), "\ n";
in
Anh ta | | said |, "| is | | pi | | 3 |. | 14 |? (| I | '| m | | not | | chắc
Anh ta | | đã nói |, | | "| Là | | pi | | 3.14 |? | | (| Tôi | không | | chắc |) |. |"
Khác
Ở đây chúng tôi ghi lại các chuỗi dấu gạch chéo ngược không thuộc một trong các loại trên.
Đó là:
\ C (Không được dùng nữa.) "\ C" luôn khớp với một octet duy nhất, ngay cả khi chuỗi nguồn được mã hóa
ở định dạng UTF-8 và ký tự được so khớp là một ký tự gồm nhiều octet. Đây là
rất nguy hiểm, vì nó vi phạm tính trừu tượng của ký tự lôgic và có thể gây ra
Các trình tự UTF-8 trở nên không đúng định dạng.
Thay vào đó, hãy sử dụng "utf8 :: encode ()".
Ghi nhớ: oCngày tết.
\ K Điều này xuất hiện trong perl 5.10.0. Bất kỳ thứ gì khớp với bên trái của "\ K" không được bao gồm trong $ &, và
sẽ không được thay thế nếu mẫu được sử dụng để thay thế. Điều này cho phép bạn viết
"s / PAT1 \ K PAT2 / REPL / x" thay vì "s / (PAT1) PAT2 / $ {1} REPL / x" hoặc "s / (? <= PAT1)
PAT2 / REPL / x ".
Ghi nhớ: Kep.
\ N Tính năng này, có sẵn bắt đầu từ v5.12, khớp với bất kỳ ký tự nào không a
dòng mới. Nó là viết tắt của cách viết "[^ \ n]" và giống với "."
metasymbol, ngoại trừ dưới cờ "/ s", làm thay đổi ý nghĩa của ".", nhưng không
"\N".
Lưu ý rằng "\ N {...}" có thể có nghĩa là một ký tự được đặt tên hoặc đánh số.
Ghi nhớ: Bổ sung \n.
\ R "\ R" khớp với a chủng loại dòng mới; nghĩa là, bất kỳ thứ gì được coi là chuỗi ngắt dòng bởi
Bảng mã Unicode. Điều này bao gồm tất cả các ký tự được so khớp bởi "\ v" (khoảng trắng dọc) và
chuỗi nhiều ký tự "\ x0D \ x0A" (ký tự xuống dòng theo sau là nguồn cấp dòng,
đôi khi được gọi là mạng newline; nó là phần cuối của chuỗi dòng được sử dụng trong Microsoft
tệp văn bản được mở ở chế độ nhị phân). "\ R" tương đương với "(?> \ X0D \ x0A | \ v)". (Các
lý do nó không quay ngược là trình tự được coi là không thể tách rời. Điều đó
có nghĩa là
"\ x0D \ x0A" = ~ / ^ \ R \ x0A $ / # Không khớp
không thành công, vì "\ R" khớp với toàn bộ chuỗi và sẽ không quay lại để khớp chỉ
"\ x0D".) Vì "\ R" có thể khớp với một chuỗi nhiều hơn một ký tự, nó không thể được
đặt bên trong một lớp ký tự có dấu ngoặc vuông; "/ [\ R] /" là một lỗi; sử dụng "\ v" để thay thế. "\ R"
đã được giới thiệu trong perl 5.10.0.
Lưu ý rằng điều này không tôn trọng bất kỳ ngôn ngữ nào có thể có hiệu lực; nó phù hợp
theo bộ ký tự gốc của nền tảng.
Ghi nhớ: không thực sự. "\ R" được chọn vì PCRE đã sử dụng "\ R", v.v.
quan trọng là vì Unicode đề xuất một siêu ký tự biểu thức chính quy như vậy và
gợi ý "\ R" làm ký hiệu của nó.
\ X Điều này phù hợp với một Unicode gia tăng biểu đồ cụm.
"\ X" khá khớp với cách sử dụng bình thường (không phải lập trình viên Unicode) sẽ coi là
ký tự đơn. Ví dụ, hãy xem xét một G với một số loại dấu phụ, chẳng hạn như
như một mũi tên. Không có ký tự đơn lẻ nào như vậy trong Unicode, nhưng một ký tự có thể được tạo bởi
bằng cách sử dụng chữ G theo sau là Unicode "KẾT HỢP CÁC PHẦN THƯỞNG MŨI TÊN BÊN DƯỚI" và sẽ là
được hiển thị bởi phần mềm nhận dạng Unicode như thể nó là một ký tự duy nhất.
Trận đấu mang tính tham lam và không theo chiều ngược lại, do đó, cụm không bao giờ bị chia thành
các thành phần nhỏ hơn.
Xem thêm "\ b {gcb}".
Ghi nhớ: eXký tự Unicode có xu hướng.
Các ví dụ
$ str = ~ s / foo \ Kbar / baz / g; # Thay đổi bất kỳ 'thanh' nào sau 'foo' thành 'baz'
$ str = ~ s / (.) \ K \ g1 // g; # Xóa các ký tự trùng lặp.
"\ n" = ~ / ^ \ R $ /; # Match, \ n là một dòng mới chung.
"\ r" = ~ / ^ \ R $ /; # Match, \ r là một dòng mới chung.
"\ r \ n" = ~ / ^ \ R $ /; # Match, \ r \ n là một dòng mới chung.
"P \ x {307}" = ~ / ^ \ X $ / # \ X khớp với P có dấu chấm ở trên.
Sử dụng perlrebackslash trực tuyến bằng các dịch vụ onworks.net