正则表达式简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确
。
在JavaScript中的定义
-
RegExp构造函数
var pattern = new RegExp("[bc]at","i");
-
字面量
var pattern = /[bc]at/i;
-
匹配模式支持三种标志:
g : global
全局搜索模式,将匹配所有的字符串,而非仅仅搜索到第一个匹配项就停止.i : ignore case
忽略字母大小写m : multiple lines
多行模式,即搜索到达一行文本末尾时会继续找下一行是否匹配
预定义的特殊字符
- 元字符 是拥有特殊意义的字符
- 正则表达式的元字符主要有:
( ) [ ] { } \ ^ $ | ? * + .
- 注:
在不同的组合中元字符有其不同的意义
。
- 字符类
- 简单类 一个字符对应字符串一个字符,使用[]来构建一个简单的类,来表示符合某一特征的一类字符.
[abc]
可以匹配 a b c 这三者当中的任一个字符- 反向类 使用 ^ 与 [] 组合表示不符合某一特征的一类字符
[^abc]
可以匹配 除 a b c 这三者之外的任一个字符- 范围类 使用 “-” 连接线来表示某个闭区间之间的内容
[a-z]
匹配所有小写字母[0-9]
匹配所有的0到9简直的任意数字- 预定义类 常用的预定义类来匹配常见的字符
.
或[^\r\n]
,匹配除了回车符和换行符之外的所有字符\d
或[0-9]
,数字字符\D
或[^0-9]
,非数字字符\s
或[\t\n\r\f\x0B\v]
,空白字符\S
或[^\t\n\r\f\x0B\v]
,非空白字符\w
或[a-zA-Z_0-9]
,单词字符(字母、数字和下划线)\W
或[^a-zA-Z_0-9]
,非单词字符
量词
使用量词可以直接匹配多次重复出现的字符
。常见的量词书写格式如下:
?
或{0,1}
,匹配到零次或一次(至多一次)+
或{1,}
,匹配到一次或多次(至少一次)*
或{0,}
,匹配到零次或多次(任意次){n}
,匹配到n次{n,m}
,匹配到至少 n 次并且至多 m 次{n,}
,匹配到至少 n 次{,m}
,匹配到至多 m 次
贪婪模式与非贪婪模式
对于 {n,m} 这种匹配方式,到底是匹配 n 个还是匹配 m 个呢
? 就涉及到 匹配模式 的问题.
贪婪模式
,默认情况下量词是 尽可能多 的匹配字符 :
var num = '1234567890'; num.match(/\d{2,4}/g); 的匹配结果是: [1234] [5678] [90]
非贪婪模式
,在量词之后加 “?” 即可按照最少的字符匹配:
var num = '1234567890'; num.match(/\d{2,4}?/g); 的匹配结果是: [12] [34] [56] [78] [90]
分组
量词只能是单个字符匹配多次,如果我们希望匹配某一组字符多次呢?
- 正则表达式中
小括号可以定义一个字符串整体为一个分组
(apple){4}
,匹配apple这个单词出现4次(apple|orange){4}
,匹配apple或orange出现4次
- 如果使用分组的正则表达式中出现多个小括号即多个分组,那么 匹配结果就会把匹配项也分组并编号,例如:
(apple)\d+(orange)
此时 \1 可以引用到 apple , \2 可以引用到 orange
- 如果我们不希望捕获某些分组,只需要在分组的小括号前面紧跟一个问号和冒号即可
(?:apple)\d+(orange)
边界
正则表达式也为我们提供了几个常用的边界匹配字符:
^X
,以字符X
开头X$
,以字符X
结尾\b
,单词边界,指\w
之外的字符\B
,非单词边界
注: 单词边界匹配的是一个位置,这个位置的一侧是构成单词的字符,但另一侧为非单词字符、字符串的开始或结束位置。
前瞻
前瞻用来匹配接下来出现的是或不是某一个特定的字符集
exp1(?=exp2)
,匹配后面是exp2的exp1
(/apple(?=orange)/).test('appleorange123'); => true
(/apple(?=orange)/).test('applepear345'); => false
exp1(?!exp2)
,匹配后面不是exp2的exp1
(/apple(?!orange)/).test('appleorange123'); => false
(/apple(?!orange)/).test('applepear345'); => true