该文章转载自我的博客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"]
- ... ↩
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。