--- title: RegExp.prototype.exec() slug: Web/JavaScript/Reference/Global_Objects/RegExp/exec tags: - Biểu thức chính quy - Phương Thức - Tham khảo translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/exec ---
Phương thức exec()
tiến hành tìm kiếm một so khớp trong một chuỗi xác định. Trả về một mảng kết quả hoặc {{jsxref("null")}}.
Nếu bạn đơn giản chỉ muốn xác định có khớp hay không, tức kết quả trả về là true hoặc false, bạn nên sử dụng phương thức {{jsxref("RegExp.prototype.test()")}} hoặc phương thức {{jsxref("String.prototype.search()")}}.
regexObj.exec(str)
str
Nếu so khớp thành công, phương thức exec()
trả về một mảng và cập nhật các thuộc tính của đối tượng biểu thức chính quy. Mảng trả về item đầu tiên là đoạn text khớp, và các item tiếp theo là giá trị trong các dấu ngoặc tròn có nhớ đã khớp.
Nếu việc so khớp thất bại, exec()
trả về {{jsxref("null")}}.
Hãy xem xét ví dụ sau:
// So khớp "quick brown" theo sau bởi "jumps", bỏ qua các kí tự ở giữa // Nhớ "brown" và "jumps" // Không phân biệt chữ hoa/thường var re = /quick\s(brown).+?(jumps)/ig; var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
Bảng dưới đây là kết quả trả về của so khớp trên.
Đối tượng | Thuộc tính/Chỉ mục | Mô tả | Ví dụ |
result |
[0] |
Chuỗi đầy đủ của các kí tự đã khớp. | Quick Brown Fox Jumps |
[1], ...[n ] |
Các chuỗi con khớp được đặt trong ngoặc, nếu có. Số lượng ngoặc không giới hạn. |
[1] = Brown |
|
index |
Chỉ mục (tính từ 0) của bản khớp trong chuỗi. |
4 |
|
input |
Chuỗi ban đầu. | The Quick Brown Fox Jumps Over The Lazy Dog |
|
re |
lastIndex |
Chỉ mục bắt đầu tìm so khớp tiếp theo. Khi không có cờ "g" thì chỉ mục sẽ trở về 0. |
25 |
ignoreCase |
Xác định xem liệu cờ "i" (không phân biệt chữ hoa/thường) được sử dụng hay không. | true |
|
global |
Xác định liệu cờ "g" (so khớp toàn cục) có được sử dụng hay không. | true |
|
multiline |
Xác định xem cờ "m" (tìm kiếm chuỗi đa dòng) có được sử dụng hay không. | false |
|
source |
mẫu dùng để so khớp. | quick\s(brown).+?(jumps) |
Nếu biểu thức chính quy của bạn sử dụng cờ g, bạn có thể dùng phương thức exec() nhiều lần để tìm các so khớp tiếp theo trong chuỗi giống vậy. Lúc đó, việc tìm kếu bắt đầu từ chuỗi con của str đã được chỉ định bởi thuộc tính {{jsxref("RegExp.lastIndex", "lastIndex")}} của biểu thức chính quy. ({{jsxref("RegExp.prototype.test()", "test()")}} cũng sẽ tăng tới thuộc tính {{jsxref("RegExp.lastIndex", "lastIndex")}} property. Ví dụ, giả sử bạn có kịch bản:
var myRe = /ab*/g; var str = 'abbcdefabh'; var myArray; while ((myArray = myRe.exec(str)) !== null) { var msg = 'Found ' + myArray[0] + '. '; msg += 'Next match starts at ' + myRe.lastIndex; console.log(msg); }
Kịch bản này hiển thị văn bản sau:
Found abb. Next match starts at 3 Found ab. Next match starts at 9
Chú ý: Đừng đặt biểu thức chính quy thuần (hoặc cấu trúc {{jsxref("RegExp")}}) bên trong điều kiện while hoặc nó sẽ tạo ra một vòng lặp vĩnh cửu nếu có một so khớp vì thuộc tính {{jsxref("RegExp.lastIndex", "lastIndex")}} sẽ reset lại sau mỗi vòng lặp. Và hãy chắc rằng cờ toàn cùng được xét nếu không một vòng lặp sẽ xảy ra.
exec()
với RegExp
thuầnBạn có thể sử dụng exec() mà không cần tạo đối tượng {{jsxref("RegExp")}}:
var matches = /(hello \S+)/.exec('This is a hello world!'); console.log(matches[1]);
Kịch bản này sẽ ghi ra lời nhắn chứa 'hello world!'.
Specification | Status | Comment |
---|---|---|
{{SpecName('ES3')}} | {{Spec2('ES3')}} | Initial definition. Implemented in JavaScript 1.2. |
{{SpecName('ES5.1', '#sec-15.10.6.21', 'RegExp.exec')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-regexp.prototype.exec', 'RegExp.exec')}} | {{Spec2('ES6')}} | |
{{SpecName('ESDraft', '#sec-regexp.prototype.exec', 'RegExp.exec')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.RegExp.exec")}}