2018-11-13

Hướng dẫn về Regex

Hướng dẫn về Regex - Một bản tóm tắt nhanh bằng các ví dụ

Cụm từ thông dụng (regex hoặc regexp) cực kỳ hữu ích trong việc trích xuất thông tin từ bất kỳ văn bản nào bằng cách tìm kiếm một hoặc nhiều kết quả phù hợp của mẫu tìm kiếm cụ thể (ví dụ: chuỗi ký tự ASCII hoặc unicode cụ thể).
Các trường của phạm vi ứng dụng từ xác nhận hợp lệ đến phân tích cú pháp / thay thế chuỗi, đi qua việc dịch dữ liệu sang các định dạng khác và trích xuất web.
Một trong những tính năng thú vị nhất là khi bạn đã học cú pháp, bạn có thể sử dụng công cụ này trong hầu hết các ngôn ngữ lập trình (JavaScript, Java, VB, C #, C / C ++, Python, Perl, Ruby , Delphi, R, Tcl, và nhiều người khác) với sự phân biệt nhỏ nhất về sự hỗ trợ của các tính năng nâng cao và các phiên bản cú pháp được hỗ trợ bởi các công cụ).
Hãy bắt đầu bằng cách xem xét một số ví dụ và giải thích.

Chủ đề cơ bản

Neo - ^ và $

^ Các         kết quả phù hợp với bất kỳ chuỗi nào bắt đầu bằng  The -> Hãy thử nó! 
end $         khớp với chuỗi kết thúc bằng  kết thúc
^ Kết thúc chuỗi kết hợp chính xác $ (bắt đầu và kết thúc bằng Kết thúc )
roar         khớp với bất kỳ chuỗi nào có tiếng gầm trong đó

Định lượng - * +? và {}

abc *         khớp với một chuỗi có ab theo sau là 0 hoặc nhiều hơn c -> Hãy thử nó! 
abc +         khớp với chuỗi có ab theo sau bởi một hoặc nhiều c
abc ?         khớp với một chuỗi có ab theo sau là 0 hoặc 1 c
abc {2}       khớp với chuỗi có ab theo sau là 2 c
abc {2,}      khớp với một chuỗi có ab theo sau bởi 2 hoặc nhiều hơn c
abc {2,5}     khớp với chuỗi có ab theo sau là 2 đến 5 c
a (bc) *       khớp với chuỗi có tiếp theo là 0 hoặc nhiều bản sao của chuỗi bc
a (bc) {2,5}   khớp với chuỗi có tiếp theo là 2 đến 5 bản của chuỗi bc

Toán tử OR - | hoặc là []

a (b | c)      khớp với một chuỗi có dấu sau là b hoặc c -> Thử nó!
một [bc]       giống như trước

Các lớp ký tự - \ d \ w \ s và.

\ d          phù hợp với một ký tự đơn là một chữ số -> Hãy thử nó! 
\ w          khớp với một ký tự từ (ký tự chữ và số cộng với gạch dưới) -> Dùng thử!
\ s          khớp với ký tự khoảng trắng (bao gồm các tab và ngắt dòng)
.          phù hợp với bất kỳ nhân vật -> Hãy thử nó! 
Sử dụng  .toán tử cẩn thận vì lớp thường hoặc lớp nhân vật phủ định (chúng tôi sẽ đề cập đến tiếp theo) nhanh hơn và chính xác hơn.
\d\wVà \scũng trình bày phủ nhận của họ với \D\Wvà \Stương ứng.
Ví dụ, \Dsẽ thực hiện kết quả nghịch đảo đối với kết quả thu được \d.
\ D          khớp với một ký tự không phải là chữ số -> Hãy thử! 
Để được thực hiện theo nghĩa đen, bạn phải thoát khỏi các ký tự ^.[$()|*+?{\bằng dấu gạch chéo ngược \vì chúng có ý nghĩa đặc biệt.
\ $ \ d        phù hợp với chuỗi có $ trước một chữ số -> Dùng thử! 
Lưu ý rằng bạn có thể khớp với các ký tự không in được như tab \t, dòng mới \n, trả về vận chuyển \r.

Cờ

Chúng tôi đang học cách xây dựng một regex nhưng quên một khái niệm cơ bản: cờ .
Một regex thường đi kèm với dạng này , trong đó mẫu tìm kiếm được phân cách bởi hai ký tự gạch chéo Cuối cùng, chúng ta có thể chỉ định một cờ với các giá trị này (chúng ta cũng có thể kết hợp chúng với nhau):/abc//
  • g (toàn cầu) không trở lại sau trận đấu đầu tiên, khởi động lại các tìm kiếm tiếp theo từ cuối trận đấu trước đó
  • m (nhiều dòng) khi được bật ^và $sẽ khớp với phần bắt đầu và kết thúc của một dòng, thay vì toàn bộ chuỗi
  • i (không nhạy cảm) làm cho toàn bộ biểu thức không phân biệt chữ hoa chữ thường (ví dụ /aBc/isẽ khớp AbC)

Chủ đề trung gian

Nhóm và chụp - ()

a ( bc )            dấu ngoặc đơn tạo một nhóm chụp với giá trị bc -> Hãy thử nó! 
một (: bc ) * sử dụng : chúng tôi vô hiệu hóa các nhóm chụp -> Hãy thử nó! 
a (? <foo> bc )      bằng cách sử dụng ? <foo> chúng tôi đặt tên cho nhóm -> Dùng thử!
Toán tử này rất hữu ích khi chúng ta cần trích xuất thông tin từ chuỗi hoặc dữ liệu bằng ngôn ngữ lập trình ưa thích của bạn. Bất kỳ nhiều lần xuất hiện được một số nhóm chụp sẽ được hiển thị dưới dạng một mảng cổ điển: chúng ta sẽ truy cập vào các giá trị của chúng chỉ định sử dụng một chỉ mục trên kết quả của trận đấu.
Nếu chúng ta chọn đặt tên cho các nhóm (sử dụng ), chúng ta sẽ có thể lấy các giá trị nhóm bằng cách sử dụng kết quả phù hợp như một từ điển mà các phím sẽ là tên của mỗi nhóm.(?<foo>...)

Biểu thức khung - []

[abc]             phù hợp với một chuỗi mà có hoặc là một hoặc ab hoặc ac ->  giống như a | b | c -> Hãy thử nó! 
[ac]             giống như trước
[a-fA-F0-9]       một chuỗi đại diện cho một chữ số thập lục phân đơn lẻ, không phân biệt chữ hoa chữ thường -> Hãy dùng thử! 
[0-9]%            một chuỗi có ký tự từ 0 đến 9 trước dấu%
[^ a-zA-Z]         một chuỗi không có chữ cái từ a đến z hoặc từ A đến Z. Trong trường hợp này dấu ^ được sử dụng làm từ chối biểu thức -> Hãy thử nó! 
Hãy nhớ rằng bên trong khung biểu thức tất cả các ký tự đặc biệt (bao gồm cả dấu gạch chéo ngược \) mất quyền hạn đặc biệt của chúng: vì vậy chúng tôi sẽ không áp dụng "quy tắc thoát".

Tham lam và lười biếng

Các định lượng ( * + {}) là toán tử tham lam, do đó chúng mở rộng kết quả phù hợp với chúng thông qua văn bản được cung cấp.
Ví dụ: <.+>đối sánh <div>simple div</div>trong Để chỉ bắt được thẻ, chúng tôi có thể sử dụng thẻ  để làm cho nó lười biếng:This is a <div> simple div</div> testdiv?
<. +?>             khớp với bất kỳ ký tự nào một hoặc nhiều lần được bao gồm bên trong <> , mở rộng khi cần -> Hãy thử! 
Lưu ý rằng một giải pháp tốt hơn nên tránh việc sử dụng có  .lợi cho một regex nghiêm ngặt hơn:
<[^ <>] +>          khớp với bất kỳ ký tự nào ngoại trừ <hoặc> một hoặc nhiều lần được bao gồm bên trong <> -> Hãy dùng thử! 

Chủ đê nâng cao

Ranh giới - \ b và \ B

\ b abc \ b           thực hiện tìm kiếm "chỉ toàn bộ từ" -> Dùng thử! 
\bđại diện cho một neo giống như dấu mũ (tương tự $và ^) khớp với một bên là một ký tự từ (như \w) và mặt kia không phải là ký tự từ (ví dụ nó có thể là đầu chuỗi hoặc ký tự khoảng trắng).
Nó đi kèm với nó phủ định , \BĐiều này khớp với tất cả các vị trí \bkhông khớp và có thể là nếu chúng ta muốn tìm mẫu tìm kiếm được bao quanh hoàn toàn bởi các ký tự từ.
\ B abc \ B           chỉ phù hợp nếu mẫu được bao quanh hoàn toàn bởi các ký tự từ -> Hãy thử!

Tham chiếu ngược - \ 1

( [abc] ) \ 1               bằng cách sử dụng \ 1 nó khớp với cùng một văn bản được so khớp bởi nhóm chụp đầu tiên -> Hãy thử nó! 
([abc]) ( [de] ) \ 2 \ 1 chúng ta có thể sử dụng \ 2 (\ 3, \ 4, v.v.) để xác định cùng một văn bản được so khớp bởi nhóm chụp thứ hai (thứ ba, thứ tư, v.v.) -> Thử đi! 
(? <foo> [abc] ) \ k <foo>    chúng tôi đặt tên t foo o nhóm và chúng tôi tham khảo nó sau này ( \ k <foo> ). Kết quả là giống nhau của regex đầu tiên -> Hãy thử nó!

Nhìn về phía trước và nhìn phía sau -  (? =) Và  (? <=)

d (? = r )        phù hợp với chỉ khi d được theo sau bởi r , nhưng r sẽ không là một phần của kết hợp regex tổng thể -> Hãy thử nó! 
(? <= r ) d phù hợp với chỉ một d nếu được bắt đầu bởi một r , nhưng r sẽ không là một phần của kết hợp regex tổng thể -> Hãy thử nó! 
Bạn cũng có thể sử dụng toán tử phủ định!
d (?! r ) chỉ        khớp với d nếu không được theo sau bởi r , nhưng r sẽ không là một phần của kết hợp regex tổng thể -> Hãy thử nó! 
(? <! r ) d chỉ phù hợp với một d nếu không được bắt đầu bằng r , nhưng r sẽ không là một phần của trận đấu regex tổng thể -> Hãy thử nó!