Chuyển đến nội dung chính

Tìm hiểu về Regular Expressions 

           Regular Expression hay còn gọi là biểu thức chính quy được dùng để xử lý chuỗi nâng cao thông qua biểu thức riêng của nó, những biểu thức này sẽ có những nguyên tắc riêng và bạn phải tuân theo nguyên tắc đó thì biểu thức của bạn mới hoạt động được. Ngoài cái tên gọi Regular Expression ra thì nó còn có thể viết tắt thành RegEx. Hiểu đơn giản Regex là cách để diễn tả một đoạn mẫu phức tạp dùng đẻ tìm kiếm bằng một chuỗi, ví dụ như bạn có thể check một chuỗi bao gồm chữ hoặc số, kiểm tra số lượng ký tự, lấy ra chuỗi theo chuẩn cho trước.

           Regex có thể sử dụng được trong hầu hết các ngôn ngữ, để học Regex cơ bản thì khá đơn giản, bạn chỉ cần học những expression cơ bản rồi kết hợp chúng lại với nhau. Các bạn có thể vào trang https://regex101.com để tìm hiểu và thử ngay đoạn regex mình viết.

Một số cú pháp Regular expression:

  • .
               Ở dạng mặc định, ký tự này khớp với bất kỳ một ký tự thông thường                     nào ngoại trừ ký tự newline(\n).
  • $
      Khớp với ký tự cuối chuỗi(ký tự giả định được thêm vào cuối mỗi chuỗi hoặc trước ký tự newline trong trường hợp chuỗi có nhiều dòng). Ví dụ biểu thức ‘foo‘ sẽ khớp với cả hai chuỗi ‘foo’ và ‘foobar’ trong khi biểu thức ‘foo$‘ chỉ khớp với chuỗi ‘foo’ mà không khớp với chuỗi ‘foobar’ nữa.
  • *
      làm cho biểu thức chính quy khớp với 0 hoặc nhiều lần lặp lại của biểu thức chính quy được định nghĩa trước nó, càng nhiều lần lặp lại càng tốt. Ví dụ biểu thức ‘ab*‘ sẽ khớp với ‘a’, ‘ab’ hoặc ‘a’ theo sau bởi bất kỳ số chữ cái ‘b’ nào.
  • +
      Làm cho biểu thức chính quy khớp với 1 hoặc nhiều lần lặp lại của biểu thức chính quy được định nghĩa trước nó. Ví dụ ‘ab+‘ sẽ khớp với ‘a’ theo sau bởi bất kỳ số chữ cái ‘b’ nào(khác 0, tức là chữ b xuất hiện ít nhất 1 lần), và nó không khớp với chuỗi ‘a’ nữa.
  • ?
      làm cho biểu thức chính quy khớp với 0 hoặc 1 lần lặp lại của biểu thức chính quy được định nghĩa trước đó. Ví dụ ab? sẽ khớp với chuỗi ‘a’ hoặc ‘ab’.
  • *?‘, ‘+?‘, ‘??
      Ký tự ‘*‘, ‘+‘ và ‘?‘ là các ký tự tham lam, chúng sẽ khớp với chuỗi dài nhất có thể. Đôi khi hành vi này là không mong muốn, nêu biểu thức ‘<.*>‘ được so khớp với chuỗi ‘<a> b <c>’, nó sẽ khớp với toàn bộ chuỗi(nhưng ta lại chỉ muốn tìm ra chuỗi ‘<a>’ và ‘<c>’). Thêm dấu ‘?‘ vào sau chúng sẽ giải quyết được vấn đề này. Nó sẽ tìm ra chuỗi khớp với mẫu với ít ký tự nhất có thể. Sử dụng ‘<.*?>‘ sẽ chỉ khớp với chuỗi ‘<a>’.
  • {m}
      chỉ định rằng chính xác m bản sao của biểu thức chính quy được định nghĩa trước đó được lặp lại, ít hơn sẽ không khớp. Ví dụ, ‘a{6}‘ sẽ khớp với chính xác 6 ký tự ‘a’, chuỗi có 5 ký tự ‘a’ sẽ không khớp.
  • {m,n}
      chỉ định rằng biểu thức chính quy sẽ khớp với m đến n lần lặp lại của biểu thức chính quy được định nghĩa trước đó, có gắng khớp nhiều nhất có thể. Ví dụ ‘a{3,5}‘ sẽ khớp với chuỗi từ 3 đến 5 ký tự ‘a’. Nếu bỏ qua m, nó sẽ mặc định là 0, còn n mặc định là vô hạn. Ví dụ ‘a{4,}b‘ sẽ khớp với ‘aaaab’ hoặc một nghìn ký tự ‘a’ theo sau là ký tự ‘b’.
  • {m,n}?
      Đây là phiên bản không tham lam của biểu thức trước, chỉ định rằng biểu thức chính quy sẽ khớp với m đến n lần lặp lại của biểu thức chính quy được định nghĩa trước đó, có gắng khớp ít nhất có thể. Ví dụ trong chuỗi 6 ký tự ‘a’, biểu thức ‘a{3,5}‘ sẽ khớp với 5 ký tự ‘a’ trong khi biểu thức ‘a{3,5}?‘ chỉ khớp với 3 ký tự ‘a’.
  • \
      Đây có thể là ký tự với nhãn không phải ký tự đặc biệt(cho phép bạn coi các ký tự ‘*?.‘ như các ký tự thông thường) hoặc là sự bắt đầu cho một ký tự đặc biệt, ví dụ ‘\n, \t‘.
  • […]
      Được sử dụng để thể hiện tập các ký tự.
      Các ký tự có thể được liệt kê riêng lẻ. Ví dụ ‘[akm]‘ sẽ khớp với ký tự ‘a’ hoặc ‘k’ hoặc ‘m’.
      Có thể liệt kê bằng 1 khoảng các ký tự, giữa ký tự bắt đầu và kết thúc cách nhau bởi dấu ‘‘. Ví dụ ‘[a-z]‘ sẽ khớp với tất cả các ký tự viết thường từ ‘a’ tới ‘z’. ‘[0-5][0-9]‘ sẽ khớp với tất cả các số có 2 chữ số trong khoảng từ 00 đến 59. Nếu bạn thực sự muốn liệt kê ký tự ‘‘ trong tập hợp thì hãy nhớ lại cách dùng dấu ‘\‘ (sử dụng biểu thức ‘[a-z]‘) hoặc thêm dấu ‘‘ vào đầu hoặc cuối tập hợp(‘[a-]‘).
      Các ký tự đặc biệt trong dấu ‘[]‘ sẽ được coi như ký tự thông thường. Ví dụ ‘[(+*)]‘ sẽ khớp với bất kỳ ký tự ‘(‘, ‘+‘ hoặc ‘)‘ nào.
  • |
      A|B‘, trong đó A và B là các biểu thức chính quy tùy ý. Đây là một biểu thức chính quy khớp với các chuỗi khớp với biểu thức A hoặc B. Số lượng bất kỳ các biểu thức chính quy có thể được phân cách nhau theo cách này. Nó như phép toán OR trong số học.
  • (…)
      Khớp với bất kỳ biểu thức chính quy nào bên trong dấu ngoặc đơn. Nó cũng là ký hiệu cho biết điểm bắt đầu và kết thúc của một nhóm. Các giá trị khớp với biểu thức trong cặp dấu ngoặc đơn được lưu lại và có thể được sử dụng lại sau này.
  • Các ký tự đặc biệt được bắt đầu bởi dấu ‘\‘:
  • \number
      khớp với nội dung của nhóm được đánh số. Ví dụ, ‘(.+)\1‘ khớp với chuỗi ‘the the’ thì ‘\1‘ sẽ có giá trị là chuỗi ‘the the’. Các chuỗi được đánh số từ 1 tới 99.
  • \A
      chỉ khớp với giá trị đầu chuỗi
  • \b
      khớp với chuỗi rỗng, nhưng chỉ ở đầu hoặc cuối của một từ. Một từ được định nghĩa là một chuỗi các ký tự chữ, số hoặc dấu gạch dưới. Do đó, kết thúc của một từ có thể được biểu thị bằng dấu khoảng trắng hoặc ký tự không phải chữ, số và dấu gạch dưới. ‘\b‘ được định nghĩa là ranh giới giữa một ‘\w‘ và một ‘\W‘(hoặc ngược lại) hoặc giữa ‘\w‘ với ký tự bắt đầu/ kết thúc của một chuỗi. Ví dụ, ‘r’\bfoo\b’‘ sẽ khớp với ‘foo’, ‘foo.’, ‘(foo)’, ‘bar foo baz’ nhưng không khớp với ‘foobar’ hoặc ‘foo3’.
  • \B
      khớp với chuỗi rỗng, nhưng chỉ khi nó không đứng ở vị trí bắt đầu hoặc kết thúc 1 từ. Điều này có nghĩa là ‘r’py\B’‘ khớp với chuỗi ‘python’, ‘python3’, ‘py2’ nhưng không khớp với ‘py.’, ‘py’ hoặc ‘py!’. Đây là trường hợp đối nghịch với ‘\b‘.
  • \d
      khớp với bất kỳ chữ số thập phân nào, tương đương với ‘[0-9]
  • \D
      Khớp với bất kỳ ký tự không phải chữ số nào, tương đương với tập hợp ”[^0-9]
  • \s
      khớp với bất kỳ ký tự khoảng trắng nào, tương đương với tập hợp ‘[\t\n\r\f\v]
  • \S
      khớp với bất kỳ ký tự nào không phải khoảng trắng, tương đương với tập hợp ‘[^\t\n\r\f\v]
  • \w
      khớp với bất kỳ ký tự chữ, số nào và dấu gạch dưới, điều này tương đương với tập hợp ‘[a-zA-Z0-9_]‘.
  • \W
      khớp với bất kỳ ký tự không phải chữ, số nào và dấu gạch dưới, điều này tương đương với tập hợp ‘[^ a-zA-Z0-9_]
  • \Z
      chỉ khớp với giá trị cuối chuỗi.
Ví dụ 1: lấy địa chỉ URL :



Ví dụ 2: Lấy email từ chuỗi:


Ví dụ 3: Xóa bỏ console.log() từ file js:





Nhận xét

Bài đăng phổ biến từ blog này

Đa ngôn ngữ trong Angular  Trong phần này mình sẽ thêm chức năng đa ngôn ngữ cho project angular. Chúng ta sử dụng thư viện @ngx-translate cho bài viết, bạn có thể tham khảo ở  @ngx-translate   Trước tiên chúng ta cần tạo project và import thư viện: ng new angular-translate cd  angular-translate npm install @ngx-translate/core --save npm install @ngx-translate/http-loader --save Sau đó chúng ta import thư viện  TranslateModule  vào app.module.ts: -Tiếp đó chúng ta tao 2 file en.json và vn.json vào thư mục /assets/i18n/en.json -Tiếp đó chúng ta thiết lập sự kiện click chuyển ngôn ngữ trong file app.component.ts: - Để hiển thị trên giao diện, chúng ta sử dụng service TranslateService đã được khai báo trong contructor() như một pipe: Kết quả : Bằng việc truyền value vào event switchLanguage() chúng ta có thể thay đổi ngôn ngữ của trang Như vậy chúng ta đã hoàn thành xong việ...
  Giới thiệu về Spring Integration Giới thiệu      Spring Integration là một framework cho phép việc cấu hình động các tầng của hệ thống.  Nó giúp cho việc cấu hình linh động, dàn xếp các module trở nên độc lập, dễ dàng thay đổi phù hợp mục đích nâng cấp (xem hình 1 ) Hình - 1    Spring Integration cho phép nhắn tin giữa các module dựa trên Spring-based applications và nó hỗ trợ tích hợp với các hệ thông bên ngoài thông qua bộ khai báo. Mục đích chính của Spring Integration là cung cấp một mô hình đơn giản để xây dựng các giải pháp tích hợp doanh nghiệp trong khi vẫn duy trì cac mối liên kết cần thiết để có thể kiểm tra, bảo trì.    Nó đưa khái niệm về POJO lên thêm một bước nữa, nơi mà POJO được kết nối với nhau bằng cách sử dụng một mô hình nhắn tin và các thành phần riêng lẻ không thể nhận biết được các thành phần khác trong ứng dụng. Một ứng dụng được xây dựng bằng cách lắp ráp các thành phần, có thể tái sử dụng, tạ...
Get data from an API service in Angular  1. Promises và Observables  Promises:     Là một đối tượng được lập trình để thao tác bất đồng bộ trong Javascript. Nó đại diện cho một giá trị mà chúng ta muốn thao tác nhưng có thể hiện tại chưa có sẵn nhưng trong tương lại nó có giá trị trong promise đó. Một số đặc điểm của promise là: - Chỉ trả về một giá trị duy nhất, đó có thể là object, array, number.... - Không thể cancel được request - Được khởi tạo ngay mặc dù chưa được đăng ký, miễn là bạn khai báo một promise thì nó sẽ chạy contructor. Promise có ba trạng thái : Pending: khi khởi tạo đối tượng promise, gọi một request đến server. Fulfilled: thao tác gọi đến server thành công sẽ chuyển từ pending sang fulfilled qua phương thức then() (có thể xử lý kết quả thành công trong phương thức then() ). Rejected: khi request đến server bị lỗi, có thể dùng .catch() để bắt lỗi. Observables:     Tương tự như promise nhưng có mộ...