#### JavaScript match()
#### 定義和用法
match() 方法可在字符串內檢索指定的值,或找到一個或多個正則表達式的匹配。
該方法類似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。
#### 語法 - /字符串或數字匹配
~~~
stringObject.match(searchvalue)
~~~
|參數|描述|
| --- | --- |
|searchvalue|必需。規定要檢索的字符串值或者數字。|
注釋:當參數是一個字符串或一個數字,它會使用new RegExp(obj)來隱式轉換成一個 RegExp。如果它是一個有正號的正數,RegExp() 方法將忽略正號。
例子 1.
~~~
<script type="text/javascript">
var str="Hello world!";
document.write(str.match("world") + "<br />"); //world
document.write(str.match("World") + "<br />"); //null
document.write(str.match("worlld") + "<br />"); //null
document.write(str.match("world!")); //world!
</script>
~~~
例子 2.
~~~
var str1 = "NaN means not a number. Infinity contains -Infinity and +Infinity in JavaScript.",
str2 = "My grandfather is 65 years old and My grandmother is 63 years old.",
str3 = "The contract was declared null and void.";
str1.match("number"); // "number" 是字符串。返回["number"]
str1.match(NaN); // NaN的類型是number。返回["NaN"]
str1.match(Infinity); // Infinity的類型是number。返回["Infinity"]
str1.match(+Infinity); // 返回["Infinity"]
str1.match(-Infinity); // 返回["-Infinity"]
str2.match(65); // 返回["65"]
str2.match(+65); // 有正號的number。返回["65"]
str3.match(null); // 返回["null"]
~~~
#### 返回值
匹配的字符串。沒有找到匹配字符串時候返回null。
* * * * *
#### 語法 - /正則匹配
~~~
stringObject.match(regexp)
~~~
|參數|描述|
| --- | --- |
|regexp |必需。規定要匹配的模式的 RegExp 對象。如果該參數不是 RegExp 對象,則需要首先把它傳遞給 RegExp 構造函數,將其轉換為 RegExp 對象。|
#### 返回值
存放匹配結果的數組。該數組的內容依賴于 regexp 是否具有全局標志 g。
#### 說明
match() 方法將檢索字符串 stringObject,以找到一個或多個與 regexp 匹配的文本。這個方法的行為在很大程度上有賴于 regexp 是否具有標志 g。
如果 regexp 沒有標志 g,那么 match() 方法就只能在 stringObject 中執行一次匹配。如果沒有找到任何匹配的文本, match() 將返回 null。否則,它將返回一個數組,其中存放了與它找到的匹配文本有關的信息。該數組的第 0 個元素存放的是匹配文本,而其余的元素存放的是與正則表達式的子表達式匹配的文本。除了這些常規的數組元素之外,返回的數組還含有兩個對象屬性。index 屬性聲明的是匹配文本的起始字符在 stringObject 中的位置,input 屬性聲明的是對 stringObject 的引用。
~~~
<script type="text/javascript">
var str="That's hot!";
var patt1=/h.t/;
document.write(str.match(patt1)); //hat
/*
*str.match(patt1)匹配數組 :
* 0->hat
* index->1
* input->"That's hot!"
* length->1
*/
</script>
~~~
~~~
<script type="text/javascript">
var str = 'For more information, see Chapter 3.4.5.1';
var re = /see (chapter \d+(\.\d)*)/i;
var found = str.match(re);
console.log(found);
// logs [ 'see Chapter 3.4.5.1',
// 'Chapter 3.4.5.1',
// '.1',
// index: 22,
// input: 'For more information, see Chapter 3.4.5.1' ]
// 'see Chapter 3.4.5.1' 是整個匹配。
// 'Chapter 3.4.5.1' 被'(chapter \d+(\.\d)*)'捕獲。
// '.1' 是被'(\.\d)'捕獲的最后一個值。
// 'index' 屬性(22) 是整個匹配從零開始的索引。
// 'input' 屬性是被解析的原始字符串。
</script>
~~~
如果 regexp 具有標志 g,則 match() 方法將執行全局檢索,找到 stringObject 中的所有匹配子字符串。若沒有找到任何匹配的子串,則返回 null。如果找到了一個或多個匹配子串,則返回一個數組。數組元素中存放的是 stringObject 中所有的匹配子串,但是沒有 index 屬性或 input 屬性。
~~~
<script type="text/javascript">
var str="1 plus 2 equal 3";
document.write(str.match(/\d+/g));//數組打印:1,2,3
/*
*str.match(/\d+/g)匹配數組 :
* 0->"1"
* 1->"2"
* 2->"3"
*/
</script>
~~~
注意:在全局檢索模式下,match() 即不提供與子表達式匹配的文本的信息,也不聲明每個匹配子串的位置。如果您需要這些全局檢索的信息,可以使用 RegExp.exec()。
例子:match 使用全局(global)和忽略大小寫(ignore case)標志
下例展示了 match 使用 global 和 ignore case 標志。A-E、a-e 的所有字母將會作為一個數組的元素返回。
~~~
var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var regexp = /[A-E]/gi;
var matches_array = str.match(regexp);
console.log(matches_array);
// ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
~~~
[MDN-參考資料](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/match)