1. String.prototype.replace
語(yǔ)法: str.replace(regexp|substr, newSubStr|function)
返回值: 一個(gè)部分或全部匹配由替代模式所取代的新的字符串
描述: 該方法并不改變調(diào)用它的字符串本身,而只是返回一個(gè)新的替換后的字符串。 在進(jìn)行全局的搜索替換時(shí),正則表達(dá)式需包含 g 標(biāo)志。
變量名 | 變量含義 |
---|---|
$$ | 插入一個(gè) "$"蒸绩。 |
$& | 插入匹配的子串。 |
$` | 插入當(dāng)前匹配的子串左邊的內(nèi)容。 |
$' | 插入當(dāng)前匹配的子串右邊的內(nèi)容骡尽。 |
$n | 假如第一個(gè)參數(shù)是 RegExp對(duì)象,并且 n 是個(gè)小于100的非負(fù)整數(shù)擅编,那么插入第 n 個(gè)括號(hào)匹配的字符串攀细。 |
替換字符串可以插入下面的特殊變量名:
變量名 | 變量含義 |
---|---|
$$ | 插入一個(gè) "$"箫踩。 |
$& | 插入匹配的子串。 |
$` | 插入當(dāng)前匹配的子串左邊的內(nèi)容谭贪。 |
$' | 插入當(dāng)前匹配的子串右邊的內(nèi)容境钟。 |
$n | 假如第一個(gè)參數(shù)是 RegExp對(duì)象,并且 n 是個(gè)小于100的非負(fù)整數(shù)俭识,那么插入第 n 個(gè)括號(hào)匹配的字符串慨削。 |
指定一個(gè)函數(shù)作為參數(shù)
你可以指定一個(gè)函數(shù)作為第二個(gè)參數(shù)。在這種情況下套媚,當(dāng)匹配執(zhí)行后缚态, 該函數(shù)就會(huì)執(zhí)行。 函數(shù)的返回值作為替換字符串堤瘤。 (注意: 上面提到的特殊替換參數(shù)在這里不能被使用玫芦。)
另外要注意的是, 如果第一個(gè)參數(shù)是正則表達(dá)式本辐, 并且其為全局匹配模式桥帆, 那么這個(gè)方法將被多次調(diào)用, 每次匹配都會(huì)被調(diào)用师郑。
參數(shù)名 | 描述 |
---|---|
match | 匹配的子串环葵。(對(duì)應(yīng)于上述的$&。) |
p1,p2,... | 假如replace()方法的第一個(gè)參數(shù)是一個(gè)RegExp 對(duì)象宝冕,則代表第n個(gè)括號(hào)匹配的字符串张遭。(對(duì)應(yīng)于上述的$1,$2等地梨。) |
offset | 匹配到的子字符串在原字符串中的偏移量菊卷。(比如,如果原字符串是“abcd”宝剖,匹配到的子字符串是“bc”洁闰,那么這個(gè)參數(shù)將是1) |
string | 被匹配的原字符串。 |
函數(shù)的參數(shù)
參數(shù)名 | 描述 |
---|---|
match | 匹配的子串万细。(對(duì)應(yīng)于上述的$&扑眉。) |
p1,p2,... | 假如replace()方法的第一個(gè)參數(shù)是一個(gè)RegExp 對(duì)象,則代表第n個(gè)括號(hào)匹配的字符串赖钞。(對(duì)應(yīng)于上述的$1腰素,$2等。) |
offset | 匹配到的子字符串在原字符串中的偏移量雪营。(比如弓千,如果原字符串是“abcd”,匹配到的子字符串是“bc”献起,那么這個(gè)參數(shù)將是1) |
string | 被匹配的原字符串洋访。 |
function replacer(match, p1, p2, p3, offset, string) {
// p1 is nondigits, p2 digits, and p3 non-alphanumerics
return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
console.log(newString); // abc - 12345 - #$*%
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
console.log(newstr); // Smith, John
function styleHyphenFormat(propertyName) {
function upperToHyphenLower(match) {
return '-' + match.toLowerCase();
}
return propertyName.replace(/[A-Z]/g, upperToHyphenLower);
}
styleHyphenFormat('borderTop') // 'border-top'
2. String.prototype.match
語(yǔ)法: str.match(regexp);
參數(shù): 一個(gè)正則表達(dá)式對(duì)象镣陕。如果傳入一個(gè)非正則表達(dá)式對(duì)象,則會(huì)隱式地使用 new RegExp(obj) 將其轉(zhuǎn)換為一個(gè) RegExp姻政。 如果你未提供任何參數(shù)呆抑,直接使用 match() ,那么你會(huì)得到一個(gè)包含空字符串的 Array :[""] 扶歪。
返回值: 如果字符串匹配到了表達(dá)式理肺,會(huì)返回一個(gè)數(shù)組,數(shù)組的第一項(xiàng)是進(jìn)行匹配完整的字符串善镰,之后的項(xiàng)是用圓括號(hào)捕獲的結(jié)果妹萨。如果沒(méi)有匹配到,返回null
描述:
- 如果正則表達(dá)式不包含 g 標(biāo)志炫欺,則 str.match() 會(huì)返回和 RegExp.exec() 相同的結(jié)果乎完。而且返回的 Array 擁有一個(gè)額外的 input 屬性,該屬性包含被解析的原始字符串品洛。
- 另外树姨,還擁有一個(gè) index 屬性,該屬性表示匹配結(jié)果在原字符串中的索引(以0開(kāi)始)桥状。如果正則表達(dá)式包含 g 標(biāo)志帽揪,則該方法返回一個(gè) Array ,它包含所有匹配的子字符串而不是匹配對(duì)象辅斟。
- 捕獲組不會(huì)被返回(即不返回index屬性和input屬性)转晰。如果沒(méi)有匹配到,則返回 null 士飒。
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']
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' 是整個(gè)匹配查邢。
// 'Chapter 3.4.5.1' 被'(chapter \d+(\.\d)*)'捕獲。
// '.1' 是被'(\.\d)'捕獲的最后一個(gè)值酵幕。
// 'index' 屬性(22) 是整個(gè)匹配從零開(kāi)始的索引扰藕。
// 'input' 屬性是被解析的原始字符串。
3. String.prototype.search
語(yǔ)法: str.search(regexp)
參數(shù): 一個(gè)正則表達(dá)式(regular expression)對(duì)象芳撒。如果傳入一個(gè)非正則表達(dá)式對(duì)象邓深,則會(huì)使用 new RegExp(obj) 隱式地將其轉(zhuǎn)換為正則表達(dá)式對(duì)象。
返回值: 如果匹配成功笔刹,則 search() 返回正則表達(dá)式在字符串中首次匹配項(xiàng)的索引庐完。否則,返回 -1徘熔。
4. String.prototype.split
語(yǔ)法: str.split([separator[, limit]])
Tip:
- 如果空字符串("")被用作分隔符,則字符串會(huì)在每個(gè)字符之間分割淆党。
- 當(dāng)字符串為空時(shí)酷师,split()返回一個(gè)包含一個(gè)空字符串的數(shù)組讶凉,而不是一個(gè)空數(shù)組,如果字符串和分隔符都是空字符串山孔,則返回一個(gè)空數(shù)組懂讯。
注意: 如果分隔符是包含捕獲括號(hào)的正則表達(dá)式,則每次分隔符匹配時(shí)台颠,捕獲括號(hào)的結(jié)果(包括任何未定義的結(jié)果)將被拼接到輸出數(shù)組中褐望。但是,并不是所有瀏覽器都支持此功能串前。
var myString = "Hello 1 word. Sentence number 2.";
var splits = myString.split(/(\d)/);
console.log(splits); // [ "Hello ", "1", " word. Sentence number ", "2", "." ]
5. RegExp.prototype.test
語(yǔ)法: regexObj.test(str)
返回值: 如果正則表達(dá)式與指定的字符串匹配 瘫里,返回true;否則false荡碾。
6. RegExp.prototype.exec
語(yǔ)法: regexObj.exec(str)
返回值: 如果匹配成功谨读,exec() 方法返回一個(gè)數(shù)組,并更新正則表達(dá)式對(duì)象的屬性坛吁。返回的數(shù)組將完全匹配成功的文本作為第一項(xiàng)劳殖,將正則括號(hào)里匹配成功的作為數(shù)組填充到后面。 如果匹配失敗拨脉,exec() 方法返回 null哆姻。
描述:
var re = /quick\s(brown).+?(jumps)/ig;
var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
對(duì)象 | 對(duì)象/索引 | 描述 | 例子 |
---|---|---|---|
result | [0] | 匹配的全部字符串 | Quick Brown Fox Jumps |
[1], ...[n ] | 括號(hào)中的分組捕獲 | [1] = Brown [2] = Jumps | |
index | 匹配到的字符位于原始字符串的基于0的索引值 | 4 | |
input | 原始字符串 | The Quick Brown Fox Jumps Over The Lazy Dog | |
re | lastIndex | 下一次匹配開(kāi)始的位置 | 25 |
ignoreCase | 是否使用了 "i" 標(biāo)記使正則匹配忽略大小寫 | true | |
global | 是否使用了 "g" 標(biāo)記來(lái)進(jìn)行全局的匹配. | true | |
multiline | 是否使用了 "m" 標(biāo)記使正則工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的開(kāi)始和結(jié)束(行是由 \n 或 \r 分割的)玫膀,而不只是整個(gè)輸入字符串的最開(kāi)始和最末尾處矛缨。) | false | |
source | 正則匹配的字符串 | quick\s(brown).+?(jumps) |
下表列出這個(gè)腳本的返回值:
對(duì)象 | 對(duì)象/索引 | 描述 | 例子 |
---|---|---|---|
result | [0] | 匹配的全部字符串 | Quick Brown Fox Jumps |
[1], ...[n ] | 括號(hào)中的分組捕獲 | [1] = Brown [2] = Jumps | |
index | 匹配到的字符位于原始字符串的基于0的索引值 | 4 | |
input | 原始字符串 | The Quick Brown Fox Jumps Over The Lazy Dog | |
re | lastIndex | 下一次匹配開(kāi)始的位置 | 25 |
ignoreCase | 是否使用了 "i" 標(biāo)記使正則匹配忽略大小寫 | true | |
global | 是否使用了 "g" 標(biāo)記來(lái)進(jìn)行全局的匹配. | true | |
multiline | 是否使用了 "m" 標(biāo)記使正則工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的開(kāi)始和結(jié)束(行是由 \n 或 \r 分割的)匆骗,而不只是整個(gè)輸入字符串的最開(kāi)始和最末尾處劳景。) | false | |
source | 正則匹配的字符串 | quick\s(brown).+?(jumps) |
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);
}
result:
Found abb. Next match starts at 3
Found ab. Next match starts at 9
總結(jié):
- 如果你只是為了判斷是否匹配(true或 false),可以使用 RegExp.test() 方法碉就,或者 String.search() 方法盟广。
- 若想知道更多信息(然而執(zhí)行比較慢),可使用exec() 方法(類似于 String.prototype.match() 方法)瓮钥。 和 exec() (或者組合使用),一樣筋量,在相同的全局正則表達(dá)式實(shí)例上多次調(diào)用test將會(huì)越過(guò)之前的匹配。