Patterns : Chuỗi Tìm

flags : Cờ

Biểu thức chính quy là các mẫu (Patterns) để tìm kiếm và thay thế trong văn bản.

Trong JavaScript, chúng có sẵn thông qua đối tượng RegExp , cũng như được tích hợp trong các phương thức của chuỗi.

I.Patterns : Chuỗi Tìm

Cú pháp "dài":

regexp = new RegExp("pattern", "flags");

Và cú pháp "ngắn", sử dụng dấu gạch chéo(slashes ) "/":

regexp = /pattern/; // không cờ( no flags)
regexp = /pattern/gmi; // với 3 cờ(flags) g,m và i 

Dấu ngoặc chéo /.../ đóng vai trò ngoặc kép của chuỗi 

new RegExp được sử dụng thường xuyên hơn khi chúng ta cần tạo regexp “nhanh chóng” từ chuỗi động

let tag = prompt("Bạn muốn tìm thẻ nào?", "h2");

let regexp = new RegExp(`<${tag}>`); // kết quả /<h2>/ nếu được trả lời "h2" trong lời nhắc ở trên

II.flags : Cờ

Cờ sẽ ảnh hưởng đến kế quả tìm kiếm

Cờ g tìm tất cả kết quả phù hợp trong chuỗi (nếu không có cờ này chỉ tìm giá trị đầu tiên)

Cờ i Không phân biệt chữ hoa và chữ thường

Cờ m tìm kiếm ở chế độ đa dòng ( 1 đoạn văn có nhiều dòng xuống hàng, thêm cờ m để tìm tất cả)

Các cờ khác : 

  • global
  • case insensitive
  • multiline
  • single line (dotall)
  • unicode
  • sticky

Ví dụ về tìm kiếm match:

let str1 = `1st place: 5Winnie6
2nd place: Piglet
3rd place: Eeyore`;

let str2 = `1st place: 5Winnie6
2nd place: Piglet
3rd place: Eeyore`;


console.log( str1.match(/^\d/g) ); // 1
console.log( str2.match(/\d$/gm) ); // 6

III.Tìm kiếm: str.match

str.match(regexp) tìm tất cả các kết quả phù hợp regexp trong chuỗi str.

  • Nếu biểu thức chính quy có cờ g,

(nó trả về một mảng gồm tất cả các kết quả phù hợp):

let str = "We will, we will rock you";

alert( str.match(/we/gi) ); // We,we (một mảng gồm 2 chuỗi con phù hợp)

Lưu ý: cả hai We và we đều được tìm thấy, bởi vì cờ i làm cho biểu thức chính quy không phân biệt chữ hoa chữ thường.

  • Trường hợp không có cờ g:
let str = "We will, we will rock you";

let result = str.match(/we/i); // không có flag g

alert( result[0] );     // We (1st match)
alert( result.length ); // 1

// Details:
alert( result.index );  // 0 (position of the match)
alert( result.input );  // We will, we will rock you (source string)
  • Trường hợp null  (báo lỗi console)
let matches = "JavaScript".match(/HTML/); // = null

if (!matches.length) { // null báo lôi:  Error: Cannot read property 'length' of null
  alert("dòng này không chạy");
}
  • Trường hợp bắt lỗi error 
let matches = "JavaScript".match(/HTML/) || []; //kết quả luôn là 1 mảng

if (!matches.length) {
  alert("No matches"); // dòng này chạy
}

IV.Thay thế: str.replace

Phương thức str.replace(regexp, replacement) thay thế các kết quả phù hợp được tìm thấy bằng cách sử dụng regexp trong chuỗi str với replacement (tất cả các kết quả phù hợp nếu có cờ g, nếu không, chỉ kết hợp đầu tiên).

// none flag g (không có cờ g)
alert( "We will, we will".replace(/we/i, "I") ); // I will, we will

// with flag g (có cờ g)
alert( "We will, we will".replace(/we/ig, "I") ); // I will, I will

Đối số thứ hai là replacement. chúng ta có thể sử dụng các tổ hợp ký tự đặc biệt để thêm các đoạn khớp

$&chèn toàn bộ match
$`chèn một phần của chuỗi trước match
$'chèn một phần của chuỗi sau match
$nnếu nlà một số có 1-2 chữ số, thì nó sẽ chèn nội dung của dấu ngoặc thứ n, tìm hiểu thêm về nó trong chương Bắt nhóm
$<name>chèn nội dung của dấu ngoặc đơn với nội dung đã cho name, tìm hiểu thêm về nó trong chương Bắt nhóm
$$chèn ký tự$

Một ví dụ với $&:

alert( "I love HTML".replace(/HTML/, "$& and JavaScript") ); // I love HTML and JavaScript

 

V.Testing: regexp.test

Phương thức: regexp.test(str) sẽ tìm kiếm ít nhất một kết quả phù hợp, nếu được tìm thấy thì trả về true, ngược lại false.

let str = "I love JavaScript";
let regexp = /LOVE/i;

alert( regexp.test(str) ); // true

Tóm tắt:

  • Một biểu thức chính quy bao gồm (một mẫu và các cờ tùy chọn)
  • str.match(regexp)tìm kiếm các kết quả phù hợp
  • str.replace(regexp, replacement)  (tìm kiếm và thay thế)
  • regexp.test(str)   : trả về true nếu có ít nhất 1 kết quả và ngược lại trả về false