String.prototype.match()
试一试
语法
match(regexp)
参数
regexp
-
一个正则表达式对象,或任何具有
Symbol.match
方法的对象。如果
regexp
不是RegExp
对象且没有Symbol.match
方法,则会使用new RegExp(regexp)
隐式将其转换为RegExp
。如果您不提供任何参数并直接使用
match()
方法,则会得到一个包含空字符串的Array
:[""]
,因为这等效于match(/(?:)/)
。
返回值
一个 Array
,其内容取决于全局 (g
) 标志的存在与否,或者如果未找到匹配项则返回 null
。
- 如果使用了
g
标志,则将返回与完整正则表达式匹配的所有结果,但不包括捕获组。 - 如果没有使用
g
标志,则仅返回第一个完整匹配项及其相关的捕获组。在这种情况下,match()
将返回与RegExp.prototype.exec()
相同的结果(一个具有某些额外属性的数组)。
描述
String.prototype.match
本身的实现非常简单——它只是使用字符串作为第一个参数调用参数的 Symbol.match
方法。实际的实现来自 RegExp.prototype[Symbol.match]()
。
- 如果您需要知道一个字符串是否与正则表达式
RegExp
匹配,请使用RegExp.prototype.test()
。 - 如果您只需要第一个匹配项,则可能需要使用
RegExp.prototype.exec()
代替。 - 如果您希望获取捕获组并且设置了全局标志,则需要使用
RegExp.prototype.exec()
或String.prototype.matchAll()
代替。
有关传递正则表达式时 match()
语义的更多信息,请参阅 RegExp.prototype[Symbol.match]()
。
示例
使用 match()
在以下示例中,match()
用于查找以 "Chapter"
开头,后跟一个或多个数字字符,然后是一个小数点,最后是零个或多个数字字符。
正则表达式包含 i
标志,以便忽略大小写差异。
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
// ]
在上面的匹配结果中,'see Chapter 3.4.5.1'
是整个匹配项。'Chapter 3.4.5.1'
被 (chapter \d+(\.\d)*)
捕获。'.1'
是 (\.\d)
捕获的最后一个值。index
属性 (22
) 是整个匹配项的基于零的索引。input
属性是被解析的原始字符串。
使用全局和忽略大小写标志与 match()
以下示例演示了如何使用全局标志和忽略大小写标志与 match()
。将返回所有字母 A
到 E
和 a
到 e
,每个字母都是数组中的一个元素。
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']
注意:另请参阅 String.prototype.matchAll()
和 使用标志进行高级搜索。
使用命名捕获组
在支持命名捕获组的浏览器中,以下代码将 "fox"
或 "cat"
捕获到名为 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"}
在没有参数的情况下使用 match()
const str = "Nothing will come of nothing.";
str.match(); // returns [""]
使用实现 [Symbol.match]()
的非 RegExp 对象与 match() 匹配
如果一个对象具有 Symbol.match
方法,则它可以用作自定义匹配器。Symbol.match
的返回值将成为 match()
的返回值。
const str = "Hmm, this is interesting.";
str.match({
[Symbol.match](str) {
return ["Yes, it's interesting."];
},
}); // returns ["Yes, it's interesting."]
非 RegExp 作为参数
当 regexp
参数是字符串或数字时,它会通过使用 new RegExp(regexp)
隐式转换为 RegExp
。
const str1 =
"NaN means not a number. Infinity contains -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"]
str1.match(-Infinity); // returns ["-Infinity"]
str2.match(65); // returns ["65"]
str2.match(+65); // A number with a positive sign. returns ["65"]
str3.match(null); // returns ["null"]
如果特殊字符没有正确转义,这可能会导致意外的结果。
console.log("123".match("1.3")); // [ "123" ]
这是一个匹配,因为正则表达式中的 .
匹配任何字符。为了使其仅匹配点字符本身,您需要转义输入。
console.log("123".match("1\\.3")); // null
规范
规范 |
---|
ECMAScript 语言规范 # sec-string.prototype.match |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。