正则表达式(regEx)

正则表达式是在字符串中执行搜索和替换的强大方法。可用于RegExptestexec方法,以及Stringmatchreplacesearchsplit方法。

首先,正则表达式中的特殊字符可详见MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

创建正则表达式

在js中创建正则表达式有两种方法:

1.正则表达式文字:使用反斜杠(/)包括正则表达式,比如

var reg = /abc/;

2.正则表达式构造函数:使用RegExp模式,比如:

var reg = new RegExp('abc');

使用方法

1.str.search(reg)

将返回第一个匹配的位置,如果没有匹配的,就返回-1,比如:

var str = 'A girl';
console.log(str.search(/a/i));//0
2.str.macth(reg),没有’g’标志

将返回一个数组,该数组包括匹配结果,及以下属性:

  • index - 字符串第一个匹配的位置
  • input - 整串字符串

例如:

var str = "a Fame is the thirst of youth";
var result = str.match( /fame/i );
console.log(result);//["Fame", index: 2, input: "a Fame is the thirst of youth"]

如果,表达式存在...则,

var str = "a Fame is the thirst of youth";
var result = str.match( /fame.../i );
console.log(result);//["Fame is", index: 2, input: "a Fame is the thirst of youth"]

如果,表达式存在括号分隔符,则会称为数组的一个单独数组,如:

var str = "a Fame is the thirst of youth";
var result = str.match( /fa(me)/i );
console.log(result);//["Fame", "me", index: 2, input: "a Fame is the thirst of youth"]

其中i标志表示搜索不区分大小写

3.str.macth(reg),有’g’标志

当有’g’标志时,str.macth返回所有匹配的数组,没有其他属性。

比如:

var str = "Hello HEllo hello";
var result = str.match( /he/ig );
console.log(result);// ["He", "HE", "he"]

带有括号时,没有任何变化:

var str = "Hello HEllo hello";
var result = str.match( /h(e)/ig );
console.log(result);// ["He", "HE", "he"]

由此,使用’g’标志,result是一个普通数组,没有其他属性。

如果没有匹配的串,则返回null,此时不能用result.length

4.str.split(reg|str,limit)

使用正则表达式或子字符串座位分隔符分割字符串。例如:

字符串:
'12-34-56'.split('-');//[12, 34, 56]
或正则:
'12-34-56'.split(/-/);//[12, 34, 56]
5.str.replace(reg|str,str|func)

搜索并替换。如:

'12-34-56'.replace("-", ":");//12:34-56

查找并匹配第一项

若需匹配所有,则:

'12-34-56'.replace(/-/g, ":");//12:34:56

可以在其中使用特殊字符串:

符号	插入
$$	  "$"
$&	  匹配所有
$`	  匹配前的一部分
$'	  匹配后的一部分
$n	  如果n是1-2位数字,则表示从左到右数第n个圆括号的内容

例如,使用使用$&,使用"Miss.Minya"取代所有"Minya":

var str = "Minya S, Minya M and Minya B.";
console.log(str.replace(/Minya/g, 'Miss.$&'));//Miss.Minya S, Miss.Minya M and Miss.Minya B.

使用类似$1$2这样的:

var str = "Summer Minya";
console.log(str.replace(/(Summer) (Minya)/, '$2, $1')) // Minya, Summer

使用function,例如:

var i = 0;
//依次替换'hello'
console.log("HELLO-Hello-hello".replace(/hello/gi, function(str,offset,s) {
	//str 匹配到的字符串
	//offset 匹配的字符串的下标
	//s 源字符串
	console.log(`${str}、${offset}、${s}`)
	return ++i;
})); // 1-2-3

其中function中输出:
HELLO、0、HELLO-Hello-hello 
Hello、6、HELLO-Hello-hello
hello、12、HELLO-Hello-hello
6.regexp.test(str)

RegExp是regexp本身可以调用的方法。

test查找匹配并返回true/false。用法跟str.search(reg) != -1类似,例如:

var str = "I love JavaScript";
console.log( /love/i.test(str) ); // true
console.log( str.search(/love/i) != -1 ); // true
console.log( /hello/i.test(str) ); // false
console.log( str.search(/hello/i) != -1 ); // false
7.regexp.exec(str)

如果没有g标志,则regexp.exec(str)返回第一个匹配,跟str.match(reg)类似。

如果有g标志,则regexp.exec(str)返回第一个匹配并记住它在regexp.lastIndex属性后的位置。然后开始搜索regexp.lastIndex并返回下一个匹配。如果没有更多匹配,则regexp.exec返回nullregexp.lastIndex设置为0

如:

var str = "A lot about JavaScript at https://javascript.info";
var regexp = /JAVA(SCRIPT)/ig;

// 查找第一个匹配
var matchOne = regexp.exec(str);
console.log( matchOne ); // ["JavaScript", "Script", index: 12, input: "A lot about JavaScript at https://javascript.info"]
console.log( matchOne[0] ); // JavaScript
console.log( matchOne[1] ); // script
console.log( matchOne.index ); // 12 位置
console.log( matchOne.input ); // 源
console.log( regexp.lastIndex ); // 22 匹配后的开始位置

// 查找第二个匹配
var matchTwo = regexp.exec(str); // 从regexp.lastIndex开始继续查询
console.log( matchTwo[0] ); // javascript
console.log( matchTwo[1] ); // script
console.log( matchTwo.index ); // 34 位置
console.log( matchTwo.input ); // 源
console.log( regexp.lastIndex ); // 44 匹配后的开始位置

// 查找第三个匹配
var matchThree = regexp.exec(str); // 从regexp.lastIndex开始继续查询
console.log( matchThree ); // null 没有匹配项
console.log( regexp.lastIndex ); // 0 重置

‘y’标志

y标志意味着搜索应该在属性指定的位置准确找到一个匹配项,并且regexp.lastIndex只在该位置。

通常搜索是在整个字符串中进行的:/javascript/在字符串的每个地方查找“javascript”。

但是当一个正则表达式有y标志时,它只在regexp.lastIndex0默认)指定的位置查找匹配。

例如:

var str = "I love JavaScript!";
var reg = /javascript/iy;

console.log( reg.lastIndex ); // 0 默认
console.log( str.match(reg) ); // null 0位置没有匹配项

reg.lastIndex = 7;
console.log( str.match(reg) ); // JavaScript (JavaScript字符串的开始位置是7,所以正确匹配)

// 将reg.lastIndex设置为其他值,结果都是null

使用y标志主要作用是性能。

小结

仅搜索第一个匹配项:

  • 找一个匹配的位置 - str.search(reg)
  • 找完整的匹配 - str.match(reg)
  • 检查是否有匹配 - regexp.test(str)
  • 从给定的位置找到匹配 - regexp.exec(str),设置regexp.lastIndex为位置

搜索所有的匹配项:

  • 匹配数组 - str.match(reg)g标志的正则表达式
  • 获取所有匹配的关于每一个完整的信息 - regexp.exec(str)g循环中的标志

搜索并替换:

  • 用另一个字符串或函数结果替换 - str.replace(reg, str|func)

分割字符串:

  • str.split(str|reg)

两个标志:

  • g查找所有匹配的标志(全局搜索)
  • y标志完全在文本内的给定位置进行搜索

任重而道远,这只是正则的九牛一毛,路还长着呢……(待续)