js正则表达式

正则表达式是用于匹配字符串中字符组合的模式。在js中正则表达式即为RegExp对象;

构造正则表达式

方法一pattern代表一个正则表达式(两个/之间);flags代表匹配标志,可以由多个标志符组成!这样的一组符号(注意不是字符串)为字面量形式;

1
var expression = / pattern / flags ;

匹配标志:可以单独使用,也可以多个不同的标志组合使用,如:igi,gm,gmi等;

标志符 作用
g 表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
i 表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
m 表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项
y 执行“粘性”搜索,匹配从目标字符串的当前位置开始(MDN)

方法二:直接用new构造一个RegExp对象;

1
2
3
4
5
6
7
8
9
10
/* 
new RegExp(pattern [, flags])
*/

let regex = new RegExp("ab+c");

// 字面量形式
let regex = new RegExp(/^[a-zA-Z]+[0-9]*\W?_$/, "gi");
// 字符串形式,省略 /
let regex = new RegExp("^[a-zA-Z]+[0-9]*\\W?_$", "gi");

正则表达式的组成

一个正则表达式可以包含字符类、限定符、分组、向前查找以及反向引用;其中有一些元字符代表着特殊含义,因此如果要匹配这些元字符就不得不转义,转义使用符号\

方括号

方括号[]用来表示某一范围内的字符,如:

示例

元字符

元字符与转义符一起使用,代表某类特定范围的字符集;

元字符

量词

量词对字符出现的次数和位置做出规定;

量词

括号的作用

在正则表达式中可以使用括号(,)来围住一段表达式,又称为捕获括号,表示对相应的子匹配模式进行『记录』,并可以在某些返回数组中或特定变量中进行使用!

1
2
3
4
5
// MDN 示例
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
console.log(newstr); // Smith, John

RegExp对象方法

  1. test方法:按指定正则模式来判断字符串是否含有满足该模式的子串,返回truefalse
1
2
// 匹配字符串是否满足国内手机号码的模式
console.log(/^1[3|4|5|8]\d{9}$/.test("18329682154")); // true
  1. exec方法:在一个指定字符串中执行一个搜索匹配,返回一个结果数组或 null。当返回一个数组时,但此数组还包含两个额外的属性indexlastIndexindex表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。
1
2
3
4
5
6
7
8
9
10
11
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);
}

// Found abb. Next match starts at 3
// Found ab. Next match starts at 9

字符串中的正则表达式方法

字符串正则

  1. match方法:与RegExp对象的exec()类似:
1
str.match(regexp);
  1. search方法:类似于RegExp对象的test方法,如果匹配成功,则返回正则表达式在字符串中首次匹配项的索引,否则返回-1

  2. replace方法:返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的函数。该方法并不会改变原字符串

1
str.replace(regexp|substr, newSubStr|function)

当使用字符串作为替换参数时,在字符串内可以使用一些特殊的变量:

变量名 代表的值
$$ 插入一个 “$”。
$& 插入匹配的子串。
$` 插入当前匹配的子串左边的内容。
$’ 插入当前匹配的子串右边的内容。
$n 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。

当使用函数作为替换参数时,对每个匹配的子串调用该函数并使用该函数的返回值作为替换值。

该函数具有特定的参数名:

变量名 代表的值
match 匹配的子串。(对应于上述的$&。)
p1,p2, … 假如replace()方法的第一个参数是一个RegExp对象,则代表第n个括号匹配的字符串。(对应于上述的$1$2等。)
offset 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串是“bc”,那么这个参数将是1)
string 被匹配的原字符串。
1
2
3
4
//一个替换函数示例
function replacer(match, p1, p2, p3, offset, string) {
return [p1, p2, p3].join(' - ');
}
  1. split方法:使用指定的分隔符字符串或正则匹配模式将一个String对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。『相当于把分隔字符串敲掉,剩下的每截字符串组成结果数组?』
1
str.split([separator[, limit]])

当使用正则表达式作为分隔符时,表达式中若使用了捕获括号(capturing parentheses),则其匹配结果将会包含在返回的数组中。

1
2
3
4
5
// MDN示例
var myString = "Hello 1 word. Sentence number 2.";
var splits = myString.split(/(\d)/);

console.log(splits); // [ "Hello ", "1", " word. Sentence number ", "2", "." ]

参考文档

  1. JavaScript RegExp 对象
  2. 正则表达式 - JavaScript | MDN