JavaRush /Blog Java /Random-VI /RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy...
Artur
Mức độ
Tallinn

RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy. Phần 4

Xuất bản trong nhóm
RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy. Phần 1 RegEx: 20 bước ngắn để thành thạo biểu thức chính quy. Phần 2 20 bước ngắn để thành thạo các biểu thức chính quy. Phần 3 Phần cuối cùng này, ở giữa, sẽ đề cập đến những thứ chủ yếu được sử dụng bởi các bậc thầy về biểu thức chính quy. Nhưng nội dung ở các phần trước khá dễ đối với bạn phải không? Điều này có nghĩa là bạn có thể xử lý vật liệu này một cách dễ dàng! Bản gốc ở đây RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 4 - 1 <h2>Bước 16: nhóm không chụp (?:)</h2> RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 4 - 2Trong hai ví dụ ở bước trước, chúng tôi đã chụp văn bản mà chúng tôi không thực sự cần. Trong tác vụ Kích thước tệp, chúng tôi đã ghi lại khoảng trắng trước chữ số đầu tiên của kích thước tệp và trong tác vụ CSV, chúng tôi đã ghi lại dấu phẩy giữa mỗi mã thông báo. Chúng ta không cần nắm bắt những ký tự này nhưng chúng ta cần sử dụng chúng để cấu trúc biểu thức chính quy của mình. Đây là những lựa chọn lý tưởng để sử dụng nhóm mà không cần chụp, (?:). Một nhóm không thu thập thực hiện chính xác những gì nó nghe - nó cho phép các ký tự được nhóm và sử dụng trong các biểu thức thông thường, nhưng không thu thập chúng trong một nhóm được đánh số:
mẫu: (?:")([^"]+)(?:") 
string: Tôi chỉ muốn "văn bản bên trong những dấu ngoặc kép này" .
trận đấu:             ^^ ^^ ^^ ^^ 
^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ nhóm:                 1111111111111111111111111111    
( Ví dụ ) Biểu thức chính quy hiện khớp với văn bản được trích dẫn cũng như chính các ký tự trích dẫn, nhưng nhóm chụp chỉ chụp được văn bản được trích dẫn. Tại sao chúng ta nên làm điều này? Vấn đề là hầu hết các công cụ biểu thức chính quy đều cho phép bạn khôi phục văn bản từ các nhóm thu thập được xác định trong các biểu thức chính quy của bạn. Nếu chúng ta có thể cắt bớt các ký tự thừa mà chúng ta không cần mà không đưa chúng vào nhóm chụp, điều đó sẽ giúp việc phân tích và thao tác văn bản sau này dễ dàng hơn. Dưới đây là cách dọn sạch trình phân tích cú pháp CSV từ bước trước:
mẫu: (?:^|,)\s*(?:\"([^",]*)\"|([^", ]*)) 
chuỗi:   a , " b ", " cd ", e , f , " gh ", dfgi ,, k , "", l 
khớp: ^ ^ ^^^ ^ ^ ^^^ ^^ ^^ ^ ^ 
nhóm:    2 1 111 2 2 111 2222 2 2    
( Ví dụ ) Có một số điều cần <mark>lưu ý ở đây:</mark> Đầu tiên, chúng tôi không còn thu thập dấu phẩy nữa vì chúng tôi đã thay đổi nhóm thu thập (^|,)thành nhóm không thu giữ (?:^|,). Thứ hai, chúng tôi lồng nhóm chụp vào trong nhóm không chụp. Điều này hữu ích chẳng hạn khi bạn cần một nhóm ký tự xuất hiện theo một thứ tự cụ thể nhưng bạn chỉ quan tâm đến một tập hợp con của các ký tự đó. Trong trường hợp của chúng tôi, chúng tôi cần các ký tự không trích dẫn và không dấu phẩy [^",]*xuất hiện trong dấu ngoặc kép, nhưng thực tế chúng tôi không cần bản thân các ký tự trích dẫn, vì vậy chúng không cần phải ghi lại. Cuối cùng, <mark>lưu ý</mark> rằng trong ví dụ trên cũng có sự trùng khớp có độ dài bằng 0 giữa các ký tự kl. Dấu ngoặc kép ""là chuỗi con được tìm kiếm, nhưng không có ký tự nào giữa các dấu ngoặc kép, do đó chuỗi con trùng khớp không chứa ký tự nào (độ dài bằng 0). <h3>Chúng ta có nên củng cố kiến ​​thức của mình không? Dưới đây là hai nhiệm vụ rưỡi sẽ giúp chúng ta thực hiện điều này:</h3> Sử dụng các nhóm không thu thập (và các nhóm thu thập và các lớp ký tự, v.v.), viết một biểu thức chính quy chỉ thu thập các kích thước tệp được định dạng chính xác trên dòng dưới :
mẫu:
chuỗi:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
trận đấu: ^^ ^^^ ^^ ^^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    11111 1111 11111 111    
( Giải pháp ) Thẻ mở HTML bắt đầu bằng <và kết thúc bằng >. Thẻ đóng HTML bắt đầu bằng một chuỗi ký tự </và kết thúc bằng ký tự đó >. Tên thẻ được chứa giữa các ký tự này. Bạn có thể viết một biểu thức chính quy để chỉ ghi lại các tên trong các thẻ sau không? (Bạn có thể giải quyết vấn đề này mà không cần sử dụng các nhóm không bắt giữ. Hãy thử giải quyết theo hai cách! Một lần với nhóm và một lần không có.)
mẫu:
chuỗi:   <p> </span> <div> </kbd> <link> 
khớp: ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    1 1111 111 111 1111    
( Giải pháp sử dụng nhóm không bắt ) ( Giải pháp không sử dụng nhóm không bắt ) <h2>Bước 17: Liên kết ngược \Nvà nhóm bắt được đặt tên</h2> RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 4 - 3Mặc dù tôi đã cảnh báo bạn trong phần giới thiệu rằng việc cố gắng tạo trình phân tích cú pháp HTML bằng biểu thức chính quy thường dẫn đến đau lòng, ví dụ cuối cùng này là một sự chuyển tiếp thú vị sang một tính năng hữu ích khác (đôi khi) của hầu hết các biểu thức chính quy: phản hồi ngược. Liên kết ngược giống như các nhóm lặp lại nơi bạn có thể cố gắng chụp cùng một văn bản hai lần. Nhưng chúng khác nhau ở một khía cạnh quan trọng - chúng sẽ chỉ ghi lại cùng một văn bản, từng ký tự. Mặc dù một nhóm lặp lại sẽ cho phép chúng tôi nắm bắt được nội dung như thế này:
mẫu: (he(?:[az])+) 
string:   heyabcdefg hey heyo he yellow heyyyyyyyyy 
phù hợp: ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    1111111111 111 1111 11111111 11111111111    
( Ví dụ ) ...thì backlink sẽ chỉ khớp thế này thôi:
mẫu: (he([az])(\2+)) 
string: heyabcdefg hey heyo he yellow heyyyyyyyyy 
phù hợp:                              ^^ ^^ ^^ ^^ ^^^^ 
nhóm:                                 11233333333    
( Ví dụ ) Các nhóm chụp lặp lại rất hữu ích khi bạn muốn khớp cùng một mẫu nhiều lần, trong khi các liên kết ngược lại phù hợp khi bạn muốn khớp cùng một văn bản. Ví dụ: chúng tôi có thể sử dụng liên kết ngược để cố gắng tìm các thẻ HTML mở và đóng phù hợp:
mẫu: <(\w+)[^>]*>[^<]+<\/\1> 
chuỗi:   <span style="color: red">hey</span> 
khớp với: ^^^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    1111    
( Ví dụ ) <mark>Xin lưu ý</mark> rằng đây là một ví dụ cực kỳ đơn giản và tôi thực sự khuyên bạn không nên cố gắng viết trình phân tích cú pháp HTML dựa trên biểu thức chính quy. Đây là cú pháp rất phức tạp và rất có thể sẽ khiến bạn phát ốm. Các nhóm chụp được đặt tên rất giống với các liên kết ngược, vì vậy tôi sẽ trình bày ngắn gọn về chúng ở đây. Sự khác biệt duy nhất giữa phản hồi ngược và nhóm chụp được đặt tên là... nhóm chụp được đặt tên có tên:
mẫu: <(?<tag>\w+)[^>]*>[^<]+<\/(?P=tag)></tag> 
chuỗi:   <span style="color: red">này< /span> 
trận đấu: ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ 
nhóm:    1111    
( Ví dụ ) Bạn có thể tạo một nhóm thu thập được đặt tên bằng cách sử dụng cú pháp (?<name>...) hoặc (?'name'...) (biểu thức chính quy tương thích với .NET) hoặc với cú pháp này (?P<name>. ..) hoặc (?P'name'...) (biểu thức chính quy tương thích với Python). Vì chúng tôi đang sử dụng PCRE (Biểu thức chính quy tương thích Perl) hỗ trợ cả hai phiên bản nên chúng tôi có thể sử dụng một trong hai phiên bản tại đây. (Java 7 đã sao chép cú pháp .NET, nhưng chỉ sao chép phiên bản dấu ngoặc nhọn. Lưu ý của người dịch) Để lặp lại nhóm thu thập được đặt tên sau này trong biểu thức chính quy, chúng tôi sử dụng \<kname> hoặc \k'name' (.NET) hoặc (? P= tên) (Python). Một lần nữa, PCRE hỗ trợ tất cả các tùy chọn khác nhau này. Bạn có thể đọc thêm về các nhóm bắt giữ được đặt tên ở đây , nhưng đây là hầu hết những gì bạn thực sự cần biết về chúng. <h3>Nhiệm vụ giúp chúng tôi:</h3> Sử dụng backlink để giúp tôi ghi nhớ... ừm... tên người này.
mẫu:
string: "Xin chào, tên tôi là Joe." [sau] "Tên anh chàng đó là gì? Joe ?"
trận đấu:        ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^ 
nhóm:                  111    
( Giải pháp ) <h2>Bước 18: nhìn trước và nhìn sau</h2> RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 4 - 4Bây giờ chúng ta sẽ đi sâu vào một số tính năng nâng cao của biểu thức chính quy. Tôi sử dụng mọi thứ cho đến bước 16 khá thường xuyên. Nhưng những bước cuối cùng này chỉ dành cho những người sử dụng biểu thức chính quy một cách nghiêm túc để khớp các biểu thức rất phức tạp. Nói cách khác, bậc thầy về biểu thức chính quy. “Nhìn về phía trước” và “Nhìn lại” nghe có vẻ khá phức tạp nhưng thực ra chúng không quá phức tạp. Chúng cho phép bạn thực hiện điều gì đó tương tự như những gì chúng tôi đã làm với các nhóm không bắt trước đó - kiểm tra xem có bất kỳ văn bản nào ngay trước hoặc ngay sau văn bản thực tế mà chúng tôi muốn khớp hay không. Ví dụ: giả sử chúng ta chỉ muốn ghép tên của những thứ mà mọi người thích, nhưng chỉ khi họ hào hứng với nó (chỉ khi họ kết thúc câu bằng dấu chấm than). Chúng ta có thể làm điều gì đó như:
mẫu: (\w+)(?=!) 
string: Tôi thích bàn làm việc. Tôi đánh giá cao máy dập ghim. Tôi yêu đèn !
trận đấu:                                           ^^^ 
nhóm:                                              1111    
( Ví dụ ) Bạn có thể thấy nhóm chụp ở trên (\w+), thường khớp với bất kỳ từ nào trong đoạn văn, chỉ khớp với từ đèn. Nhìn về phía trước tích cực (?=!)có nghĩa là chúng tôi chỉ có thể khớp các chuỗi kết thúc bằng !nhưng chúng tôi không thực sự khớp chính ký tự dấu chấm than. Đây là một điểm khác biệt quan trọng vì với các nhóm không bắt giữ, chúng tôi khớp nhân vật nhưng không bắt được nhân vật đó. Với cái nhìn phía trước và cái nhìn phía sau, chúng ta sử dụng một ký tự để xây dựng biểu thức chính quy của mình, nhưng sau đó chúng ta thậm chí không so khớp nó với chính nó. Chúng ta có thể khớp nó sau trong biểu thức chính quy của chúng ta. Có bốn loại cái nhìn phía trước và phía sau: cái nhìn tích cực (?=...), cái nhìn tiêu cực (?!...), cái nhìn tích cực (?<=...) và cái nhìn tiêu cực (?<!. ..) . Chúng thực hiện những gì chúng trông giống như - nhìn về phía trước và nhìn phía sau tích cực cho phép công cụ biểu thức chính quy chỉ tiếp tục khớp khi văn bản có trong nhìn về phía trước/nhìn sau thực sự khớp. Cái nhìn tiêu cực và cái nhìn phía sau làm ngược lại - chúng cho phép biểu thức chính quy chỉ khớp khi văn bản chứa trong cái nhìn phía trước/cái nhìn phía sau không khớp. Ví dụ: chúng tôi chỉ muốn khớp tên phương thức trong một chuỗi các chuỗi phương thức chứ không phải đối tượng mà chúng hoạt động. Trong trường hợp này, mỗi tên phương thức phải có dấu .. Một biểu thức chính quy sử dụng một cái nhìn lại đơn giản có thể giúp ích ở đây:
mẫu: (?<=\.)(\w+) 
chuỗi: myArray. FlatMap.aggregate.summarise.print !
trùng khớp:         ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^^ 
nhóm:            1111111 111111111 111111111 11111    
( Ví dụ ) Trong văn bản trên, chúng tôi khớp bất kỳ chuỗi ký tự từ nào \w+, nhưng chỉ khi chúng đứng trước ký tự .. Chúng ta có thể đạt được điều gì đó tương tự bằng cách sử dụng các nhóm không bắt giữ, nhưng kết quả sẽ rắc rối hơn một chút:
mẫu: (?:\.)(\w+) 
chuỗi: myArray .flatMap.aggregate.summarise.print !
trận đấu:        ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^^ 
nhóm:            1111111 111111111 111111111 11111    
( Ví dụ ) Tuy ngắn hơn nhưng nó phù hợp với những ký tự mà chúng ta không cần. Mặc dù ví dụ này có vẻ tầm thường, nhưng lookahead và lookbehind thực sự có thể giúp chúng ta dọn dẹp các biểu thức chính quy. <h3>Còn rất ít cho đến khi kết thúc! 2 tác vụ sau đây sẽ đưa chúng ta tiến gần hơn đến điều đó thêm 1 bước:</h3> Giao diện phủ định (?<!...) cho phép công cụ biểu thức chính quy tiếp tục cố gắng tìm kết quả khớp chỉ khi văn bản chứa bên trong giao diện phủ định không phải là được hiển thị cho đến phần còn lại của văn bản mà bạn cần tìm kết quả phù hợp. Ví dụ: chúng ta có thể sử dụng biểu thức chính quy để chỉ khớp họ của những người phụ nữ tham dự một hội nghị. Để làm điều này, chúng tôi muốn đảm bảo rằng họ của người đó không có chữ Mr.. Bạn có thể viết một biểu thức chính quy cho điều này? (Họ có thể được coi là dài ít nhất bốn ký tự.)
mẫu:
chuỗi: ông. Brown, thưa cô. Smith , bà. Jones , cô Daisy , ông. Màu xanh lá
trùng khớp:                ^^^^ ^^^^ ^^^^ 
nhóm:                   11111 11111 11111    
( Giải pháp ) Giả sử chúng ta đang xóa cơ sở dữ liệu và chúng ta có một cột thông tin biểu thị tỷ lệ phần trăm. Thật không may, một số người viết số dưới dạng giá trị thập phân trong phạm vi [0,0, 1.0], trong khi những người khác viết tỷ lệ phần trăm trong phạm vi [0,0%, 100,0%], và vẫn có những người khác viết giá trị phần trăm nhưng lại quên ký hiệu phần trăm theo nghĩa đen %. Sử dụng giao diện phủ định (?!...), bạn có thể chỉ đánh dấu những giá trị phải là phần trăm nhưng bị thiếu chữ số không %? Đây phải là các giá trị hoàn toàn lớn hơn 1,00 nhưng không có dấu %. (Không có số nào có thể chứa nhiều hơn hai chữ số trước hoặc sau dấu thập phân.) <mark>Lưu ý</mark> rằng giải pháp này cực kỳ khó khăn . Nếu bạn có thể giải quyết vấn đề này mà không cần nhìn vào câu trả lời của tôi thì bạn đã có kỹ năng rất lớn về biểu thức chính quy!
mẫu:
chuỗi: 0,32 100,00 5,6 0,27 98% 12,2% 1,01 0,99 % 0,99 13,13 1,10 
trận đấu:      ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
nhóm:         111111 111 1111 11111 1111    
( Giải pháp ) <h2>Bước 19: Điều kiện trong Biểu thức chính quy</h2> RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 4 - 5Bây giờ chúng ta đã đạt đến điểm mà hầu hết mọi người sẽ không còn sử dụng biểu thức chính quy nữa. Có lẽ chúng tôi đã đề cập đến 95% trường hợp sử dụng các biểu thức chính quy đơn giản và mọi thứ được thực hiện trong bước 19 và 20 thường được thực hiện bằng ngôn ngữ thao tác văn bản đầy đủ tính năng hơn như awk hoặc sed (hoặc ngôn ngữ lập trình có mục đích chung). Như vậy, hãy tiếp tục để bạn biết biểu thức chính quy thực sự có thể làm được những gì. Mặc dù các biểu thức chính quy không phải là Turing hoàn chỉnh , một số công cụ biểu thức chính quy cung cấp các tính năng rất giống với một ngôn ngữ lập trình hoàn chỉnh. Một tính năng như vậy là "điều kiện". Các điều kiện của Regex cho phép các câu lệnh if-then-else, trong đó nhánh được chọn được xác định bằng "nhìn về phía trước" hoặc "nhìn lại" mà chúng ta đã học ở bước trước. Ví dụ: bạn có thể chỉ muốn khớp các mục nhập hợp lệ trong danh sách ngày:
mẫu: (?<=Feb )([1-2][0-9])|(?<=Mar )([1-2][0-9]|3[0-1]) 
chuỗi: Ngày làm việc : 28/2 , 29/2 , 30/2 , 30/3 , 31/3  
Các trận đấu:                   ^^ ^^ ^^ ^^ 
nhóm:                      11 11 22 22    
( Ví dụ ) <mark>Lưu ý</mark> rằng các nhóm trên cũng được lập chỉ mục theo tháng. Chúng ta có thể viết một biểu thức chính quy cho cả 12 tháng và chỉ ghi lại những ngày hợp lệ, sau đó sẽ được kết hợp thành các nhóm được lập chỉ mục theo tháng trong năm. Ở trên sử dụng một loại cấu trúc giống như if sẽ chỉ tìm kiếm các kết quả khớp trong nhóm đầu tiên nếu "Feb" đứng trước một số (và tương tự cho số thứ hai). Nhưng nếu chúng ta chỉ muốn sử dụng quy trình xử lý đặc biệt cho tháng 2 thì sao? Một cái gì đó như "nếu số đó đứng trước" Tháng 2 ", hãy làm điều này, nếu không thì hãy làm điều khác." Đây là cách các điều kiện thực hiện điều đó:
mẫu: (?(?<=Feb )([1-2][0-9])|([1-2][0-9]|3[0-1])) 
string: Ngày làm việc: 28 tháng 2 , 29/2 , 30/2, 30/3 , 31/3  
Các trận đấu:                   ^^ ^^ ^^ ^^ 
nhóm:                      11 11 22 22    
( Ví dụ ) Cấu trúc if-then-else trông giống như (?(If)then|else), trong đó (if) được thay thế bằng "look Forward" hoặc "look back". Trong ví dụ trên, (if) được viết là (?<=Feb). Bạn có thể thấy rằng chúng tôi đã khớp các ngày lớn hơn 29, nhưng chỉ khi chúng không theo sau "Tháng 2". Việc sử dụng giao diện trong biểu thức điều kiện rất hữu ích nếu bạn muốn đảm bảo rằng kết quả khớp được đặt trước một số văn bản. Các điều kiện nhìn về phía trước tích cực có thể gây nhầm lẫn vì bản thân điều kiện đó không khớp với bất kỳ văn bản nào. Vì vậy, nếu bạn muốn điều kiện if có giá trị thì nó phải có giá trị tương đương với lookahead như bên dưới:
mẫu: (?(?=exact)exact|else)wo 
string:chính xác khác chính xácwo  
còn lại khớp:            ^^^ ^^^ ^^^^
( Ví dụ ) Điều này có nghĩa là các điều kiện nhìn về phía trước tích cực là vô ích. Bạn kiểm tra xem liệu văn bản đó có ở phía trước hay không và sau đó cung cấp mẫu phù hợp để làm theo khi có văn bản đó. Biểu thức điều kiện không giúp ích gì cho chúng ta ở đây cả. Bạn cũng có thể thay thế phần trên bằng một biểu thức chính quy đơn giản hơn:
mẫu: (?:chính xác|else)wo 
chuỗi: chính xác khác chính xácwo khác  
khớp với:            ^^^ ^^^ ^^^^
( Ví dụ ) Vì vậy, nguyên tắc chung cho các biểu thức có điều kiện là: kiểm tra, kiểm tra và kiểm tra lại. Nếu không, các giải pháp mà bạn cho là hiển nhiên sẽ thất bại theo những cách thú vị và bất ngờ nhất :) <h3>Ở đây chúng ta đến với khối nhiệm vụ cuối cùng tách chúng ta khỏi bước cuối cùng, bước thứ 20:</h3> Viết một biểu thức chính quy mà sử dụng biểu thức điều kiện nhìn về phía trước phủ định để kiểm tra xem từ tiếp theo có bắt đầu bằng chữ in hoa hay không. Nếu vậy, chỉ lấy một chữ cái viết hoa và sau đó là chữ cái viết thường. Nếu không, hãy lấy bất kỳ ký tự từ nào.
mẫu:
chuỗi:   Jones Smith 9sfjn Hobbes 23r4tgr9h CSV Csv vVv 
phù hợp: ^^^^ ^^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^ 
nhóm:    22222 22222 11111 222222 111111111 222 111    
( Giải pháp ) Viết một biểu thức điều kiện nhìn phía sau phủ định ownschỉ ghi lại văn bản nếu nó không có văn bản đứng trước nó cloudschỉ ghi lại văn bản khi nó đứng trước văn bản cl. (Một ví dụ hơi giả tạo, nhưng bạn có thể làm gì...)
mẫu:
string: Những chú hề đó sở hữu một số đám mây . ôi.
trận đấu:              ^^ ^^ ^^ ^^   
( Giải pháp ) <h2>Bước 20: Đệ quy và nghiên cứu sâu hơn</h2> RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 4 - 6Trên thực tế, có rất nhiều thứ có thể được đưa vào phần giới thiệu 20 bước cho bất kỳ chủ đề nào và các biểu thức thông thường cũng không ngoại lệ. Có nhiều cách triển khai và tiêu chuẩn khác nhau cho các biểu thức chính quy có thể tìm thấy trên Internet. Nếu bạn muốn tìm hiểu thêm, tôi khuyên bạn nên xem trang web tuyệt vời Regularexpresss.info , đó là một tài liệu tham khảo tuyệt vời và tôi chắc chắn đã học được rất nhiều về biểu thức chính quy từ đó. Tôi thực sự khuyên bạn nên sử dụng nó cũng như Regex101.com để thử nghiệm và xuất bản các tác phẩm của bạn. Ở bước cuối cùng này, tôi sẽ cung cấp cho bạn thêm một chút kiến ​​thức về biểu thức chính quy, cụ thể là cách viết biểu thức đệ quy. Các phép đệ quy đơn giản khá đơn giản, nhưng hãy nghĩ xem điều đó có ý nghĩa gì trong bối cảnh của một biểu thức chính quy. Cú pháp đệ quy đơn giản trong một biểu thức chính quy được viết như sau: (?R)?. Tuy nhiên, tất nhiên, cú pháp này phải xuất hiện trong chính biểu thức đó. Những gì chúng ta sẽ làm là lồng biểu thức vào trong chính nó, với số lần tùy ý. Ví dụ:
mẫu: (hey(?R)?oh) 
chuỗi:   heyoh heyyoh heyheyohoh hey oh heyhey hey heyheyohoh  
trùng khớp: ^^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    11111 1111111111 1111111111    
( Ví dụ ) Vì biểu thức lồng nhau là tùy chọn ( (?R)theo sau ?), cách so khớp đơn giản nhất là bỏ qua hoàn toàn đệ quy. Vì vậy, hey, và sau đó ohkhớp với ( heyoh). Để khớp với bất kỳ biểu thức phức tạp nào hơn biểu thức này, chúng ta phải tìm chuỗi con phù hợp đó được lồng bên trong chính nó tại điểm trong biểu thức nơi chúng ta đã chèn chuỗi (?R). Nói cách khác, chúng ta có thể tìm thấy heyheyohoh hoặc heyheyheyohohoh, v.v. Một trong những điều tuyệt vời về các biểu thức lồng nhau này là, không giống như các tham chiếu ngược và các nhóm thu thập được đặt tên, chúng không giới hạn bạn ở văn bản chính xác mà bạn đã khớp trước đó, từng ký tự. Ví dụ:
mẫu: ([Hh][Ee][Yy](?R)?oh) 
chuỗi:   heyoh heyyoh hEyHeYohoh hey oh heyhey hEyHeYHEyohohoh  
phù hợp: ^^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    11111 1111111111 111111111111111    
( Ví dụ ) Bạn có thể tưởng tượng rằng công cụ biểu thức chính quy sao chép và dán biểu thức chính quy của bạn vào chính nó theo đúng nghĩa đen với số lần tùy ý. Tất nhiên, điều này có nghĩa là đôi khi nó có thể không đạt được những gì bạn mong đợi:
mẫu: ((?:\(\*)[^*)]*(?R)?(?:\*\))) 
chuỗi: (* nhận xét (* lồng *) không *)
trận đấu:            ^^ ^^ ^^ ^^ ^^ ^^ 
nhóm nhóm:               111111111111    
( Ví dụ ) Bạn có thể cho biết tại sao biểu thức chính quy này chỉ ghi nhận nhận xét lồng nhau chứ không phải nhận xét bên ngoài không? Một điều chắc chắn là: khi viết các biểu thức chính quy phức tạp, hãy luôn kiểm tra chúng để đảm bảo chúng hoạt động theo cách bạn nghĩ. Cuộc biểu tình tốc độ cao dọc theo những con đường biểu đạt thông thường này đã kết thúc. Tôi hy vọng bạn thích cuộc hành trình này. Chà, và cuối cùng, tôi sẽ rời khỏi đây, như tôi đã hứa lúc đầu, một số liên kết hữu ích để nghiên cứu sâu hơn về tài liệu:
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION