String.prototype.match()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Phương thức match() của các giá trị String lấy kết quả khớp của string này với một biểu thức chính quy.
Try it
const paragraph = "The quick brown fox jumps over the lazy dog. It barked.";
const regex = /[A-Z]/g;
const found = paragraph.match(regex);
console.log(found);
// Expected output: Array ["T", "I"]
Cú pháp
match(regexp)
Tham số
regexp-
Một đối tượng biểu thức chính quy, hoặc bất kỳ đối tượng nào có phương thức
Symbol.match.Nếu
regexpkhông phải là đối tượngRegExpvà không có phương thứcSymbol.match, nó được ngầm định chuyển đổi thànhRegExpbằng cách sử dụngnew RegExp(regexp).Nếu bạn không truyền bất kỳ tham số nào và sử dụng trực tiếp phương thức
match(), bạn sẽ nhận được mộtArrayvới một string rỗng:[""], vì điều này tương đương vớimatch(/(?:)/).
Giá trị trả về
Một Array có nội dung phụ thuộc vào sự có mặt hay vắng mặt của cờ global (g), hoặc null nếu không tìm thấy kết quả khớp.
- Nếu cờ
gđược sử dụng, tất cả các kết quả khớp với biểu thức chính quy hoàn chỉnh sẽ được trả về, nhưng các nhóm bắt không được bao gồm. - Nếu cờ
gkhông được sử dụng, chỉ kết quả khớp đầy đủ đầu tiên và các nhóm bắt liên quan của nó được trả về. Trong trường hợp này,match()sẽ trả về kết quả tương tự nhưRegExp.prototype.exec()(một mảng với một số thuộc tính bổ sung).
Mô tả
Việc triển khai String.prototype.match không làm nhiều thứ khác ngoài việc gọi phương thức Symbol.match của đối số với string là tham số đầu tiên. Việc triển khai thực tế đến từ RegExp.prototype[Symbol.match]().
- Nếu bạn cần biết liệu một string có khớp với biểu thức chính quy
RegExphay không, hãy sử dụngRegExp.prototype.test(). - Nếu bạn chỉ muốn kết quả khớp đầu tiên được tìm thấy, bạn có thể muốn sử dụng
RegExp.prototype.exec()thay thế. - Nếu bạn muốn lấy các nhóm bắt và cờ global được đặt, bạn cần sử dụng
RegExp.prototype.exec()hoặcString.prototype.matchAll()thay thế.
Để biết thêm thông tin về ngữ nghĩa của match() khi truyền vào một regex, xem RegExp.prototype[Symbol.match]().
Ví dụ
>Sử dụng match()
Trong ví dụ sau, match() được sử dụng để tìm "Chapter" theo sau bởi một hoặc nhiều ký tự số theo sau bởi dấu thập phân và ký tự số không hoặc nhiều lần.
Biểu thức chính quy bao gồm cờ i để các sự khác biệt chữ hoa chữ thường sẽ bị bỏ qua.
const str = "For more information, see Chapter 3.4.5.1";
const re = /see (chapter \d+(\.\d)*)/i;
const found = str.match(re);
console.log(found);
// [
// 'see Chapter 3.4.5.1',
// 'Chapter 3.4.5.1',
// '.1',
// index: 22,
// input: 'For more information, see Chapter 3.4.5.1',
// groups: undefined
// ]
Trong kết quả khớp trên, 'see Chapter 3.4.5.1' là toàn bộ kết quả khớp. 'Chapter 3.4.5.1' được bắt bởi (chapter \d+(\.\d)*). '.1' là giá trị cuối cùng được bắt bởi (\.\d). Thuộc tính index (22) là chỉ mục bắt đầu từ 0 của toàn bộ kết quả khớp. Thuộc tính input là string gốc được phân tích cú pháp.
Sử dụng cờ global và ignoreCase với match()
Ví dụ sau minh họa việc sử dụng cờ global và ignore-case với match(). Tất cả các chữ cái từ A đến E và từ a đến e được trả về, mỗi chữ cái là một phần tử riêng trong mảng.
const str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const regexp = /[a-e]/gi;
const matches = str.match(regexp);
console.log(matches);
// ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
Note:
Xem thêm String.prototype.matchAll() và Advanced searching with flags.
Sử dụng các nhóm bắt được đặt tên
Trong các trình duyệt hỗ trợ các nhóm bắt được đặt tên, đoạn code sau bắt "fox" hoặc "cat" vào một nhóm có tên là animal:
const paragraph = "The quick brown fox jumps over the lazy dog. It barked.";
const capturingRegex = /(?<animal>fox|cat) jumps over/;
const found = paragraph.match(capturingRegex);
console.log(found.groups); // {animal: "fox"}
Sử dụng match() không có tham số
const str = "Nothing will come of nothing.";
str.match(); // returns [""]
Sử dụng match() với đối tượng không phải RegExp triển khai [Symbol.match]()
Nếu một đối tượng có phương thức Symbol.match, nó có thể được sử dụng như một matcher tùy chỉnh. Giá trị trả về của Symbol.match trở thành giá trị trả về của match().
const str = "Hmm, this is interesting.";
str.match({
[Symbol.match](str) {
return ["Yes, it's interesting."];
},
}); // returns ["Yes, it's interesting."]
Không phải RegExp như tham số
Khi tham số regexp là string hoặc số, nó được ngầm định chuyển đổi thành RegExp bằng cách sử dụng new RegExp(regexp).
const str1 =
"All numbers except NaN satisfy <= Infinity and >= -Infinity in JavaScript.";
const str2 =
"My grandfather is 65 years old and My grandmother is 63 years old.";
const str3 = "The contract was declared null and void.";
str1.match("number"); // "number" is a string. returns ["number"]
str1.match(NaN); // the type of NaN is the number. returns ["NaN"]
str1.match(Infinity); // the type of Infinity is the number. returns ["Infinity"]
str1.match(-Infinity); // returns ["-Infinity"]
str2.match(65); // returns ["65"]
str3.match(null); // returns ["null"]
Điều này có thể tạo ra các kết quả bất ngờ nếu các ký tự đặc biệt không được thoát đúng cách.
console.log("123".match("1.3")); // [ "123" ]
Đây là kết quả khớp vì . trong regex khớp với bất kỳ ký tự nào. Để chỉ khớp với một ký tự dấu chấm cụ thể, bạn cần thoát đầu vào.
console.log("123".match("1\\.3")); // null
Đặc tả
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-string.prototype.match> |