该文章转载自我的博客Alvin-Liu

JavaScript采用的是Perl语言正则表达式语法的一个相当完整的子集。正则表达式的模式规范是由一系列字符构成的。多数字符(包括字母数字字符)描述的都是按照字面意思进行匹配的字符。比如说 /java/ 就和所有包含子串 java 的字符串相匹配。然正则表达式中的其它字符不是按照字面意思进行匹配的,但它们都具有特殊的意义。正则表达式 /s$/ 包含两个字符, 第一个特殊字符 s 是按照字面意思与自身相匹配。第二个字符 $ 是一个特殊字符,它所匹配的是字符串的结尾。以正则表达式 /s$/ 匹配的就是以字母 s 结尾的字符串。

直接量字符:

在正则表达式中,许多标点符号都有特殊的含义。下面是常见字符和它们的含义

字符 描述
\t 制表符
\n 换行符
\r 回车符
\f 换页符
\b 与回退字符
\v 垂直制表符
\0 空字符

字符类:

将直接量字符单独放进方括号内就组成了字符类。一个字符类可以匹配它所包含的任意字符。字符类可以使用连字符来表示字符范围。

/[a-zA-Z0-9]/         //匹配任意的字母和数字

字符类表:

字符 匹配
[...] 方括号内的任意字符
1 不在方括号内的任意字符
. 除了换行和回车之外的任意字符
\w 单词字符(所有的字母)
\W 非单词字符
\s 空白字符
\S 非空白字符
\d 数字字符
\D 非数字字符
[\b] 退格直接量(特例)

重复(“贪婪的”匹配):

匹配重复字符是尽可能多地匹配,而且允许后续的正则表达式继续匹配。

重复字符语法表:

字符 含义
? 匹配前一项零次或一次
* 匹配前一项零次或多次(任意次)
+ 匹配前一项一次或多次(至少一次)
{n,m} 匹配前一项至少n次但不超过m次
{n,} 匹配前一项至少n次
{n} 匹配前一项n次

/\d{2,4}/         //匹配2 ~ 4个数字
/\s+java\s+/      //匹配前后带有一个或多个空格的字符串“java”
    

非贪婪的重复:

只须在“贪婪的”匹配的字符后跟随一个问号即可: ??+?,*?{1,5}?

选择、分组和引用

选择项的尝试匹配次序是从做左到右,直到发现了匹配项。如果左边的选择项匹配,就忽略右边的匹配项,即使它产生更好的匹配。

正则表达式的圆括号作用:

1、把单独的项组合成子表达式,以便可以像处理一个单独的单元那样用 |*+或者 ? 等来对单元格内的项进行处理。

/java(script)?/   //可以匹配字符串 java,其后可以有 script也可以没有

2、在完整的模式中定义子模式。

/[a-z]+\d+/       //假定我们关心的是每个匹配尾部的数字
/[a-z]+(\d+)/     //就可以从检索的匹配中抽取数字了

3、允许在同一正则表达式的后部引用前面的子表达式。


\1             //引用的是第一个带圆括号的子表达式,
\3             //引用的是第三个带圆括号的子表达式 ,
/[Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/    //其中的 (fun\w*) 匹配的文本可以用 \2 来引用(注意:“(?: ” 形式的分组不编码)。

注意1: 因为子表达式可以嵌套另一个子表达式,所以它的位置是参与计数的左括号的位置。

/[Jj]ava([Ss]cript)?)\sis\s(fun\w*)/       //其中嵌套的子表达式 ([Ss]cript) 可以用 \2 来指代

注意2:对正则表达式中前一个子表达式的引用,并不是对子表达式的模式的引用,而指的是与那个模式相匹配的文本的引用。

/[' ''][^' '']*[' '']/       

该例匹配的是单引号或双引号之内的0个或多个字符,但不要求左侧和右侧的引号匹配(即,都是单引号或都是双引号)

如果要匹配可用:

/([' ''])[^' '']*\1/        

正则表达式不允许双引号括起的内容中有单引号,反之亦然。所以下面之中写法是非法的:

/([' ''])[^\1]*\1/ 

正则表达式的选择、分组和引用字符:

字符 含义
| 选择,匹配左边或右边的子表达式
(....) 组合,将几个项组合为一个单元,记忆与该组匹配的字符
(?:...) 组合,将项组合为一个单元,不记忆与该组匹配的字符
\n 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式。“(?:”形式的分组编码

指定匹配位置

字符 含义
^ 匹配字符开头
$ 匹配字符结尾
\b 匹配单词边界
\B 匹配非单词边界
(?=p) 零宽正向先行断言,它断言自身出现的位置的后面能匹配表达式p
(?!p) 零宽负向先行断言,它断言自身出现的位置的前面能匹配表达式p

修饰符

修饰符 描述
i 执行对大小写不敏感的匹配
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
m 执行多行匹配

模式匹配String方法:

1、search()方法:它的参数是一个正则表达式(如果参数不是正则表达式,则首先会通过RegExp构造函数将它转换成正则表达式),返回第一个与之匹配的子串的起始位置,如果找不到,返回 -1 ;

"JavaScript".search(/script/i);      //返回4

2、replace()方法:它的第一个参数是正则表达式,第二个参数是要进行替换的字符串。如果在替换字符串中出现了 $ 加数字,那么replace() 将用与指定的子表达式匹配的文本来替换这两个字符。

var quote = /"([^"]*)"/g;         //用中文半角引号替换英文引号,同时保持引号之间的内容(存储在$1中)没有被修改
text.replace(quote, '“$1”');

3、match()方法:它的参数是一个正则表达式(如果参数不是正则表达式,则首先会通过RegExp构造函数将它转换成正则表达式),返回的是一个由匹配结果组成的数组。


var url = /(\w+):\/\/([\w.]+)\/(\s*)/;
var text = "Visit my blog at http://www.limon.space/blog";
var result = text.match(url);
result[0];           //包含 "Visit my blog at http://www.limon.space/blog"
result[1];           //包含 "http"
result[2];           //包含 "www.limon.space"
result[3];           //包含 "blog"

4、split()方法:用以将调用它的字符串拆分成一个子串组成的数组,使用的是split()的参数。


"123,456,789".split(",");                 //返回["123","456","789"]
"1, 2, 3, 4, 5".split(/\s*,\s*/);      //返回["123","456","789"]

  1. ...

Lemo_Liu
307 声望11 粉丝

The road ahead will be long and our climb will be steep.