正则表达式是JavaScript用来作模式匹配的类。它可以用来检查一串字符窜中是否有非法字符,也可以返回一串字符窜中想要的字符。
1. 如何定义正则表达式
//定义一个以s结尾的正则表达式
var pattern = /s$/;
var pattern = new RegExp(“s$”);
2. 正则表达式的字符
1. 下面的标点符号在正则表达式里有特殊的含义
^ $ . * + ? = ! : | \ / ( ) [ ] { }
如果想要匹配字符,在字符前面加上\ 。比如说/\^/匹配的字符是^。
2. 在匹配重复的字符串时有两种匹配方法:
贪婪重复:尽可能多地匹配字符
非贪婪重复:尽可能少地匹配字符
正则表达式的重复字符({},?,+,*)默认情况下都是贪婪匹配。在每一个重复字符后加上?就可以变成非贪婪重复。
比如说/a+/ 在匹配字符串“aaab”的时候匹配的是aaa
/a+?/在匹配同一串字符串是匹配的是a。
3. 圆括号在正则表达式中有多重意思。
给字符组团。在用于重复字符等字符的时候可以把它们当成一个字符。比如说/(abcd)+/匹配出现1次或多次的abcd组合。
定义子匹配同时可以存储子匹配的位置。可以用\+数字匹配。
比如:/([‘”])[^’”]*\1/
3. String 有四种支持模式匹配的方法.search(),replace(),match(),split().
1. search().
参数是一个正则表达式,返回第一个与之匹配的子串的起始位置,如果找不到匹配的,将返回-1.
如果参数不是正则表达式,首先会通过RegExp构造函数将它转换成正则表达式,search()方法不支持全局搜索,会忽略表达式中g
2. replace()
用于执行检索和替换操作。第一个参数是正则表达式,第二个参数是要进行替换的字符。该方法支持全局搜索,如果表达式中有g,就会将匹配的所有字符串都替换掉,如果没有,只会替换第一个。如果第一个参数是字符串而不是正则表达式,则会直接用字符串匹配。
举例:text.replace(/javascript/gi,”JavaScript”)
Var text =/’([^’”])’/;
text.replace(text,’”$1”’);
第二个例子中$1指代的是字符中用圆括号括起的字符串,利用了圆括号的组合和记忆功能。
3. match()
该函数的第一个参数是正则表达式,返回的值是一个由匹配结果组成的数组。如果该正则表达式有设置全局修饰符g,返回的将是所有匹配的结果。
4. split()
可以将字符串拆分成一个子串组成的数组,分隔符就是split的参数。
“123,234,234”.split(“,”);
“1,2,2,4”.split(/\s*,\s*/)
4. RegExp对象
1. RegExp构造函数
第一个参数是正则表达式的主体部分,第二个参数是可选的,指定正则表达式的修饰符。
2. RegExp的属性
source : 一个只读的字符串,包含正则表达式的文本。
global : 布尔值,说明这个正则表达式是否带有g
ignoreCase : 布尔值,说明这个正则表达式是否带有i
multiline :布尔值,说明这个正则表达式是否带有m
lastindex:可读可写的整数,如果匹配模式带有g ,这个属性存储在整个字符串中下一次检索的开始位置。
3. RegExp的方法
1. exec()
参数是一个字符串,忽略g,返回一个数组,数组的第一项是匹配的字符串,余下的元素是与圆括号内子表达式相匹配的子串。数组的index属性包含了发生匹配的字符位置,属性input引用的是正在检索的字符串。如果正则表达式中有g修饰符,RegExp的lastindex将会设置为紧挨着子串的匹配位置。
2. test ()
参数是一个字符串,返回值是布尔值。如果包含正则表达式的一个匹配结果,就返回true
字符 | 匹配什么 | 例子 |
字母数字字符 | 匹配本身 | \abcd12345\匹配字符串” 1abcd123456”中的” abcd12345” |
\0 | 空字符(\u0000) |
|
\t | Tab制表符(\u0009) |
|
\n | Newline换行符(\u000A) |
|
\v | Vertical tab垂直制表符(\u000B) |
|
\f | Form feed换页符(\u000C) |
|
\r | Carriage return回车符 (\u000D) |
|
\x nn | 由十六进制数字nn指定的拉丁字符 | \x0A 和\n是一样的 |
\u xxxx | 由十六进制xxxx指定的Unicode字符 | \u0009 和\t 是一样的。 |
\c X | 控制字符^X. | \cJ和\n是一样的 |
[…] | 匹配方括号中出现的任一字符 | /[abcd]/ |
[^….] | 方括号中出现的字符都不匹配 | /[^abcd]/ |
. | 任意字符除了换行或者其他unicode行终止符 | /./ |
\w | 任意ascii字符组成的单词,相当于[a-zA-Z0-9] |
|
\W | 任意不是ascii字符组成的单词。相当于[^a-zA-Z0-9] |
|
\s | 任意Unicode空白字符 |
|
\S | 任意不是Unicode空白字符的字符 |
|
\d | 任意ASCII数字。相当于[0-9] |
|
\D | 除了ASCII数字之外的其他字符 |
|
[\b] | 退格直接量(特例) |
|
{n,m} | 匹配前一项至少出现n次,最多出现m次 | /\d{2,4}/ 匹配2-4个数字 |
{n,} | 匹配前一项n次或者多次 | /\d{3,}/ 匹配数字至少出现3次 |
{n} | 字符出现n次 | /\d{8}/匹配数字出现8次 |
? | 字符出现0次或1次 | /\d?/ |
+ | 字符出现1次或多次 | /\s+java\s+/ |
* | 字符出现0次或多次 | /[^(]*/ |
| | 选择。匹配左边子语句或者右边的子语句 |
|
(….) | 组合。将几个项组合为一个单元,这个单元可通过“*,+,?,|”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用 | /(abcd)+/ /(ab)\d+\1/ |
(?:…) | 组合,和(…)类似,但是没有记忆功能 | /(?:abdc)\w*/ |
\n | 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式,组索引是从左到右的左括号数 | /(ab)\d+\1/ |
\b | 匹配一个单词的边界 |
|
^ | 匹配字符串的开头,在多行检索中,匹配一行的开头 |
|
$ | 匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
|
(? =p) | 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符 |
|
\B | 匹配非单词边界的位置 |
|
(?!p) | 零宽负向先行断言,要求接下来的字符都不与p匹配 |
|
i | 忽略大小写 |
|
g | 全局匹配,找到所有的匹配,而不是找到一个就返回 |
|
m | 多行匹配模式,^匹配一行的开头和字符串的开头,$匹配一行的结尾和字符串的结尾 |
|