一、正则表达式简介
简单的说,
正则表达式是一种可以用于模式匹配和替换的强有力的工具
。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk、sed、shell程序等。此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能。正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在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简直的任意数字预定义类
常用的预定义类来匹配常见的字符字符类
等价类
含义
.
[^\n\r] 匹配除了回车符和换行符之外的所有字符 \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次 {,n}
- 至多出现n次 贪婪模式与非贪婪模式
对于{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)
边界
正则表达式也为我们提供了几个常用的边界匹配字符
字符
含义
^
以 XX
开头$
以 XX
结尾\b
单词边界, 指\w之外的字符
\B
非单词边界 注:
其中单词边界匹配的是一个位置,这个位置的一侧单词字符另一侧为非单词字符
前瞻
前瞻用来匹配接下来出现的是或不是某一个特定的字符集
表达式
含义
exp1(?=exp2)
匹配后面是exp2的exp1 exp1(?!exp2)
匹配后面不是exp2的exp1 来看个例子:
(/apple(?=orange)/).test('appleorange123'); //true (/apple(?=orange)/).test('applepear345'); //false (/apple(?!orange)/).test('appleorange123'); //false (/apple(?!orange)/).test('applepear345'); //true