Javascript正则表达式
正则表达式
匹配的规则
1)什么是正则表达式(Regular Expression)?
正则表达式 使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。简单说就是按照某种规则去匹配符合条件的字符串。
在JavaScript创建正则表达式有2种方法。
第一种字面量创建的方法:
var reg = /abc/; //要以斜杠表示开始和结束
第二种是构造函数的方法:
var reg = new RegExp('abc');
一般以第一种字面量创建的方法居多,这个写法便携简单。
2)修饰符(modifier)
修饰符(modifier)表示模式的附加规则,放在正则模式的最尾部。
var reg = /abc/g; var reg = new RegExp('abc','g');
上面2条正则表达式的末尾 g 就是修饰符
有以下几种修饰符:
- g:global 全文搜索,不添加,搜索到第一个匹配停止
- i:ignore case 忽略大小写,默认大小写敏感
- m:multiple lines 多行搜索
3)元字符
正则表达式中有两种基本字符类型:
- 原义文本字符
比如我们要匹配 abc 这样的字符,其中的abc就是文本字符
var reg = /abc/
- 元字符
元字符是在正则表达式中有特殊含义的非字母字符:
例如:. + ? $ ^ * | \ ( ) { } [ ]
元字符 | 含义 |
\t | 水平制表符 |
\v | 垂直制表符 |
\n | 换行符 |
\r | 回车符 |
\0 | 空格符 |
\f | 换页符 |
\cX | 与X对应的控制字符(Ctrl+X) |
4)字符类
我们可以使用元字符 [ ] 来构建一个简单的类
所谓类是指符合某些特性的对象,一个泛指,而不是特指某些字符
表达式 [abc] 把字符 a 或 b 或 c 归为一类,表达式可以匹配这类的字符
5)字符类取反
使用元字符 ^ 创建 反向类
反向类的意思是不属于某类的内容
表达式 [^abc] 表示 不是字符 a 或 b 或 c 的内容
6)范围类
我们可以使用 [a-z] 来连接两个字符表示 从a到z的任意字符
例子:[a-z] [A-Z] [0-9] [a-zA-Z0-9]
7)预定义类
我们可以按照刚刚范围类的写法写某些属于某类的内容,但是这样写太麻烦,正则表达式中提供预定义类的写法:
字符 | 等价类 | 含义 |
. | [^\r\n] | 除了回车和换行之外的所有字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\s | [\t\n\x\x0B\f\r] | 空白符 |
\S | [^\t\n\x\x0B\f\r] | 非空白符 |
\w | [0-9a-zA-Z_] | 单词字符(字母、数字下划线) |
\W | [^0-9a-zA-Z_] | 非单词字符 |
8)边界
正则表达式提供了几个常用的边界匹配字符
字符 | 含义 |
^ | 以xxx开头 |
& | 以xxx结尾 |
\b | 单词边界 |
\B | 非单词边界 |
9)量词
假如希望匹配一个连续出现 10次 的数字字符串:
\d\d\d\d\d\d\d\d\d\d
这样写是不是很麻烦呢,正则表达式还提供了量词的字符
字符 | 含义 |
? | 出现零次或一次(最多出现一次) |
+ | 出现一次或多次(最少出现一次) |
* | 出现零次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n到m次 |
{n,} | 至少出现n次 |
10)贪婪模式和非贪婪模式
贪婪模式是尽可能的匹配更多的字符,直至匹配失败为止,比如说这个正则 \d{3,6} 来搜索字符串 123456 的话,它会匹配整个字符 123456 ,会尽可能的能匹配更多字符
非贪婪模式则是尽可能少的匹配,也就是说一旦成功匹配不再继续,做法很简单,在量词后面加上 ? 即可
代码/语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
常用方法
test
正则实例对象的test
方法返回一个布尔值,表示当前模式是否能匹配参数字符串。
var reg = /apple/; reg.test('apple and banana') // true
exec
正则实例对象的exec
方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null
。
var reg = /abc/; var arr = reg.exec('abc'); arr // ["abc", index: 0, input: "abc", groups: undefined]
与正则表达式相关的字符串的实例方法
match
字符串实例对象的match
方法对字符串进行正则匹配,返回匹配结果。
var str = 'abc'; var reg = /abc/; str.match(reg) // ["abc", index: 0, input: "abc", groups: undefined]
这个方法和正则的exec有点像,一个是将正则对字符串做匹配,这个方法是将字符串对正字做匹配。两个方法匹配成功返回的都是数组。
search
字符串对象的search
方法,返回第一个满足条件的匹配结果在整个字符串中的位置。如果没有任何匹配,则返回-1
。
var reg = /abc/; var str = '123abc'; str.search(reg) // 3
split
字符串对象的split
方法按照正则规则分割字符串,返回一个由分割后的各个部分组成的数组。
一般情况下这个方法是将字符串按照我们给定的参数设置分隔成数组,如果参数是正则表达式,那么字符串就会按照正则的规则来分隔,当正则作为参数时,第二个参数是返回数组的最大成员数。
'a, b,c, d'.split(/, */) // [ 'a', 'b', 'c', 'd' ]
用正则分隔多余的空格。