1. String.prototype.replace
语法: str.replace(regexp|substr, newSubStr|function)
返回值: 一个部分或全部匹配由替代模式所取代的新的字符串
描述: 该方法并不改变调用它的字符串本身,而只是返回一个新的替换后的字符串。 在进行全局的搜索替换时,正则表达式需包含 g 标志。
变量名 | 变量含义 |
---|---|
$$ | 插入一个 "$"。 |
$& | 插入匹配的子串。 |
$` | 插入当前匹配的子串左边的内容。 |
$' | 插入当前匹配的子串右边的内容。 |
$n | 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。 |
替换字符串可以插入下面的特殊变量名:
变量名 | 变量含义 |
---|---|
$$ | 插入一个 "$"。 |
$& | 插入匹配的子串。 |
$` | 插入当前匹配的子串左边的内容。 |
$' | 插入当前匹配的子串右边的内容。 |
$n | 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。 |
指定一个函数作为参数
你可以指定一个函数作为第二个参数。在这种情况下,当匹配执行后, 该函数就会执行。 函数的返回值作为替换字符串。 (注意: 上面提到的特殊替换参数在这里不能被使用。)
另外要注意的是, 如果第一个参数是正则表达式, 并且其为全局匹配模式, 那么这个方法将被多次调用, 每次匹配都会被调用。
参数名 | 描述 |
---|---|
match | 匹配的子串。(对应于上述的$&。) |
p1,p2,... | 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。) |
offset | 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串是“bc”,那么这个参数将是1) |
string | 被匹配的原字符串。 |
函数的参数
参数名 | 描述 |
---|---|
match | 匹配的子串。(对应于上述的$&。) |
p1,p2,... | 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。) |
offset | 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串是“bc”,那么这个参数将是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
语法: str.match(regexp);
参数: 一个正则表达式对象。如果传入一个非正则表达式对象,则会隐式地使用 new RegExp(obj) 将其转换为一个 RegExp。 如果你未提供任何参数,直接使用 match() ,那么你会得到一个包含空字符串的 Array :[""] 。
返回值: 如果字符串匹配到了表达式,会返回一个数组,数组的第一项是进行匹配完整的字符串,之后的项是用圆括号捕获的结果。如果没有匹配到,返回null
描述:
- 如果正则表达式不包含 g 标志,则 str.match() 会返回和 RegExp.exec() 相同的结果。而且返回的 Array 拥有一个额外的 input 属性,该属性包含被解析的原始字符串。
- 另外,还拥有一个 index 属性,该属性表示匹配结果在原字符串中的索引(以0开始)。如果正则表达式包含 g 标志,则该方法返回一个 Array ,它包含所有匹配的子字符串而不是匹配对象。
- 捕获组不会被返回(即不返回index属性和input属性)。如果没有匹配到,则返回 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' 是整个匹配。
// 'Chapter 3.4.5.1' 被'(chapter \d+(\.\d)*)'捕获。
// '.1' 是被'(\.\d)'捕获的最后一个值。
// 'index' 属性(22) 是整个匹配从零开始的索引。
// 'input' 属性是被解析的原始字符串。
3. String.prototype.search
语法: str.search(regexp)
参数: 一个正则表达式(regular expression)对象。如果传入一个非正则表达式对象,则会使用 new RegExp(obj) 隐式地将其转换为正则表达式对象。
返回值: 如果匹配成功,则 search() 返回正则表达式在字符串中首次匹配项的索引。否则,返回 -1。
4. String.prototype.split
语法: str.split([separator[, limit]])
Tip:
- 如果空字符串("")被用作分隔符,则字符串会在每个字符之间分割。
- 当字符串为空时,split()返回一个包含一个空字符串的数组,而不是一个空数组,如果字符串和分隔符都是空字符串,则返回一个空数组。
注意: 如果分隔符是包含捕获括号的正则表达式,则每次分隔符匹配时,捕获括号的结果(包括任何未定义的结果)将被拼接到输出数组中。但是,并不是所有浏览器都支持此功能。
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
语法: regexObj.test(str)
返回值: 如果正则表达式与指定的字符串匹配 ,返回true;否则false。
6. RegExp.prototype.exec
语法: regexObj.exec(str)
返回值: 如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。 如果匹配失败,exec() 方法返回 null。
描述:
var re = /quick\s(brown).+?(jumps)/ig;
var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
对象 | 对象/索引 | 描述 | 例子 |
---|---|---|---|
result | [0] | 匹配的全部字符串 | Quick Brown Fox Jumps |
[1], ...[n ] | 括号中的分组捕获 | [1] = Brown [2] = Jumps | |
index | 匹配到的字符位于原始字符串的基于0的索引值 | 4 | |
input | 原始字符串 | The Quick Brown Fox Jumps Over The Lazy Dog | |
re | lastIndex | 下一次匹配开始的位置 | 25 |
ignoreCase | 是否使用了 "i" 标记使正则匹配忽略大小写 | true | |
global | 是否使用了 "g" 标记来进行全局的匹配. | true | |
multiline | 是否使用了 "m" 标记使正则工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的开始和结束(行是由 \n 或 \r 分割的),而不只是整个输入字符串的最开始和最末尾处。) | false | |
source | 正则匹配的字符串 | quick\s(brown).+?(jumps) |
下表列出这个脚本的返回值:
对象 | 对象/索引 | 描述 | 例子 |
---|---|---|---|
result | [0] | 匹配的全部字符串 | Quick Brown Fox Jumps |
[1], ...[n ] | 括号中的分组捕获 | [1] = Brown [2] = Jumps | |
index | 匹配到的字符位于原始字符串的基于0的索引值 | 4 | |
input | 原始字符串 | The Quick Brown Fox Jumps Over The Lazy Dog | |
re | lastIndex | 下一次匹配开始的位置 | 25 |
ignoreCase | 是否使用了 "i" 标记使正则匹配忽略大小写 | true | |
global | 是否使用了 "g" 标记来进行全局的匹配. | true | |
multiline | 是否使用了 "m" 标记使正则工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的开始和结束(行是由 \n 或 \r 分割的),而不只是整个输入字符串的最开始和最末尾处。) | 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
总结:
- 如果你只是为了判断是否匹配(true或 false),可以使用 RegExp.test() 方法,或者 String.search() 方法。
- 若想知道更多信息(然而执行比较慢),可使用exec() 方法(类似于 String.prototype.match() 方法)。 和 exec() (或者组合使用),一样,在相同的全局正则表达式实例上多次调用test将会越过之前的匹配。