Học Regular Expression và cuộc đời bạn sẽ bớt khổ

April 25, 2018 (6y ago)

Regular Expression (RegEx) à? Nghe quen quen.

Đã bao giờ bạn ở vào các tính huống sau đây?

Bạn cần xử lý validate (kiểm tra tính hợp lệ) các trường dữ liệu nhập vào ô Text

Bạn cần copy và paste rất nhiều text từ chỗ này sang chỗ kia

Ví dụ từ XML sang C#

hoặc CSV, Excel sang C#

Tìm kiếm một chuỗi nằm ở nhiều dòng trong Visual Studio hoặc Notepad++

Ví dụ tôi cần tìm và xóa bỏ (replace all) các comment như thế này ở code cũ.

Bạn cần bóc tách dữ liệu của một trang web.

Ví dụ extract (crawling) tách lấy dữ liệu từ một trang web để lưu lại vào cơ sở dữ liệu của bạn

Cơn ác mộng đọc một chuỗi string từ DB và cố gắng chuyển đổi nó sang DateTime

Chuỗi ngày tháng lưu vào CSDL rất đa dạng. Rất khó để dùng hàm DateTime.TryParse() để tự động chuyển đổi một chuỗi thành Datetime ngon lành cành đào.

Tìm kiếm một chuỗi, lưu chuỗi đó lại và lấy chuỗi đã lưu chèn vào chỗ nào đó

Hay nói cách khác, ta cần thay một chuỗi bằng một chuỗi khác, trong chuỗi mới đó lại có chứa cả chuỗi vừa bị thay thế. Như ví dụ dưới đây sẽ cho các bạn thấy. Ta cần tìm ra ClassName, nhưng không phải thay thế ClassName đó bằng Class khác mà ta sẽ nhét nó vào 2 vị trí thay vì chỉ có 1 vị trí như hiện tại.

Vậy RegEx có thể giúp gì cho chúng ta trong các trường hợp trên?

Regular Expression sinh ra là để giúp cho cuộc đời của bạn bớt khổ. Hãy tưởng tượng xem bạn phải nai lưng ra copy-paste bao nhiêu code. Bạn hoàn toàn có thể download các tool về để replace giúp bạn. Nhưng bạn cần bao nhiêu tool cho đủ đây.

Thay vào đó, bạn hãy thử học RegEx. Bộ cú pháp này sẽ giúp cho bạn thao tác với chuỗi như dao chém chuối. Như ta thấy các ví dụ bên trên, tất cả đều là XỬ LÝ CHUỖI ví dụ Cut Copy Paste hoặc Replace chuỗi. RegEx là ngôn ngữ giúp xử lý chuỗi rất mạnh.

RegEx không phải là một ngôn ngữ lập trình. Nó chỉ là một BỘ CÚ PHÁP dùng để bắt chuỗi. Nhưng nó cực kỳ phổ biến và bất kỳ ngôn ngữ lập trình nào cũng hỗ trợ. Nó có cả trăm ngàn ứng dụng và công cụ ăn theo.

Hãy lần lượt xem qua các ví dụ sau đây để học cách sử dụng Regular Expression nhé.

Bắt đầu sử dụng Regular Expression

Để bắt đầu sử dụng và học cách dùng RegEx, mình hay dùng trang web https://regex101.com/. Giao diện như sau:

Trước hết các bạn hãy đọc qua một lượt các quy tắc bắt chuỗi (matching) đơn giản nhất của RegEx

Đừng lo, hãy xem qua các ví dụ từ từ rồi bạn sẽ hiểu

Ví dụ đơn giản

Tìm chuỗi số

Tìm ngày tháng

Link demo: https://regex101.com/r/3dNzjU/1

Tìm ngày tháng chính xác

Trong ví dụ trên thì ta thấy có chuỗi "60/60/2018" cũng được coi là ngày tháng, như thế là không chính xác. Ta hãy viết lại cho chuẩn.

Link demo: https://regex101.com/r/3dNzjU/2

Cách "tóm lấy" string cần tìm đưa vào Group

Cách tạo ra code để dùng RegEx trong các ngôn ngữ lập trình

RegEx là bộ cú pháp, tuy nhiên để áp dụng nó vào các ngôn ngữ lập trình lại phải tuân thủ theo các thư viện và quy tắc lập trình để lấy ra được các Group đã capture (thu) được. Hãy xem các tạo code ngay sau đây:

Cách bắt lấy chuỗi bất kỳ

Link demo: https://regex101.com/r/3dNzjU/3

Sử dụng RegEx trong thực tế

Trong thực tế RegEx có thể được gõ trực tiếp ở bất kỳ trình Editor nào. Ví dụ mình hay dùng Notepad++, hoặc Visual Studio

Tham khảo

Tham khảo thêm toàn bộ cú pháp RegEx bằng tiếng Anh tại: https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

Một số công cụ test RegEx Online

Bài tập về nhà

Bạn ngứa tay muốn thử học RegEx ngay và luôn cho nóng. Vậy hãy thử thực hành bằng một số bài tập từ dễ đến khó sau đây nhé.

Bài tập nhập môn:

  1. Lấy ra các chữ có chữ test trong chuỗi sau: “that tested test is testing the tester's tests”
  2. Lấy ra các số điện thoại trong chuỗi sau: ** “p:444-555-1234 f:246.555.8888 m:1235554567”**
  3. Lấy ra các mã màu RGB trong chuỗi sau: “#FF006C ABC 99AAB7FF 0xF0F73611”
  4. Lấy ra các chữ có 4 ký tự trong chuỗi sau: “drink beer, it's very nice!”
  5. Lấy ra tên file trong chuỗi URL sau: rapidshare.com/asd/asd/File.avi.html”

Đáp án ở phần comment nhé.

Bài tập dành cho học sinh giỏi (lớp học thêm)

  1. Tìm cách lấy các URL trong chuỗi HTML sau:
Lorem gyum <b>Betrag</b> von
<a href="http://www.vektor.de">Vektoren</a>
(Länge eines Vektors)
<a href="gcfa.com">GCFA</a>
<a href="//cdn.com/test.js">CDN</a>
ist das Maß einer Menge sozu…
  1. Tìm cách loại bỏ toàn bộ COMMENT trong đoạn code sau:
var sample = 0;
var my_string = "Hello World!";
// This is a comment!
function do_stuff(){
// This is another comment!
alert(‘somethings’);
/* this is a multiline
     comment */
}
  1. Tìm cách lấy ra chuỗi tiếng Nhật trong chuỗi sau: “
This is a demo story 前に来た時は北側からで、当時の光景はいまでも思い出せる。And it is true.
  1. Lấy ra những file ảnh và độ phân giải của ảnh từ chuỗi sau:
.bash_profile
workspace.doc
img0912.jpg (1280x720)
updated_img0912.png (1024x768)
documentation.html
favicon.gif
img0912.jpg (1920x1600)
access.htaccess
  1. Đọc nội dung từ trang tin rss sau: http://rss.cnn.com/rss/edition.rss Lấy ra các Tiêu đề, ngày giờ đăng, nội dung tin vắn

Đáp án các bạn post vào phần comment và cùng trao đổi nhé.

Nếu các bài tập trên đây vẫn chưa đủ, các bạn hãy làm thêm các bài tập tại trang https://regexone.com nhé, rất nhiều ví dụ hay.

Kết luận

Hi vọng bài viết nhỏ này đã giúp bạn học được cú pháp viết RegEx và áp dụng vào công việc thường ngày. Mình dùng Regex rất nhiều và nó là trợ thủ đắc lực trong quá trình code.

Các bạn thì sao? bạn đã dùng Regex vào những việc gì? Hãy kể tên bên dưới comment để mình cùng học hỏi với nhé.

Thanks các bạn đã đọc!