正则表达式
我们在文本模式匹配,格式验证的时候经常使用正则表达式,学习过编译原理的朋友,一定对这些模式匹配不陌生(楼主编译原理不及格),由于本篇博客是一个基础性讲解,所以不会有很多复杂的模式匹配的例子,主要是JS自身的基础语法和用法,以及常用的小技巧,楼主水平有限,遇到什么有用的技巧,会再次补充,也欢迎各位网友的指教,正则表达式的学习没有必要一开始往精细里使劲。
主要内容:正则表达式的定义,基础语法,String的正则方法,RegExp的正则方法
1.正则表达式的定义
js的正则表达式使用RegExp对象来表示的,可以使用new RegExp()构造方法来建立,也可以像数组和类那样使用直接量语法来创建:
var pattern = /\d+s$/;//一个或多个数字以s字母结尾 //相当于下面的定义 var pattern = new RegExp("\\d+s$"); //第一种方式必须以//作为标志,就像数组以[],类以{}作为标志一样 //用第二种方法时就不用写//了,但是\必须要转义才可以
2.基础语法(以下表格一部分来自W3School,摘取了一些重要的部分)
在正则表达式里,许多标点符号具有特殊的含义:^ $ . * + ? = ! : | \ / { } [ ] ( ) 使用这些字符直接匹配的时候都要转义字符\
2.1修饰符(跟在正则式的后面例如/abc/i)
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
2.2方括号[]方括号用于查找某个范围内的字符:
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符。 |
[^abc] | 查找任何不在方括号之间的字符。 |
[0-9a-zA-Z] | 查找任何从 0 至 9 的数字小写 a 到小写 z 的字符大写 A 到大写 Z 的字符。 |
2.3元字符(Metacharacter)是拥有特殊含义的字符:
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符。 |
\w | 查找单词字符。 |
\W | 查找非单词字符。 |
\d | 查找数字。 |
\D | 查找非数字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
\b | 匹配单词边界。 |
\B | 匹配非单词边界。 |
\0 | 查找 NUL 字符。 |
\n | 查找换行符。 |
\f | 查找换页符。 |
\r | 查找回车符。 |
\t | 查找制表符。 |
\v | 查找垂直制表符。 |
2.4量词(实现重复)
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
n{X} | 匹配包含 X 个 n 的序列的字符串。{}跟在后面 |
n{X,Y} | 至少X次但不能超过Y次 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串。 |
(对于上面的量词都是贪婪匹配,要实现非贪婪匹配在匹配后面再加一个?即可如:+? *? ?? {1,5}?)
2.5指定匹配位置
^ : 一行的开头
$ : 一行的结尾
\b : 匹配一个单词的边界
\B : 匹配非单词的边界
(?=p) : 接下来的字符串都要跟p匹配
(?!p) : 接下来的字符串都要不跟P匹配
2.6选择,分组,引用 ()
| 选择,匹配左右侧的表达式都可以,从左向右进行
(表达式) 组合,将几个项组合成一个单元,这个单元可以用+ * ? | 等来修饰,并且可以记住此组合匹配到的字符串以备以后引用,如第一个()引用时/1
(?:表达式) 只组合不记忆
/n 第n个()记忆的值
3.用于模式匹配的String方法(4个)
3.1 search() 参数是一个正则表达式,返回第一个与之相匹配的的字串的起始位置,没有匹配则返回-1 (注意在search的参数中g是不起作用的)
'javascript'.search(/script/i);//返回4
3.2 replace() 用于检索和替换,有两个参数,第一个是一个正则表达式,第二个参数是要进行替换的字符串
var text = 'i love "javascript" , do not like "actionscript"'; text.replace(/script/gi,'SCRIPT');//将替换掉所有的script为大写 //如果没有g修饰的话,将只替换第一个匹配的 text.replace(/script/i,'s');//只替换第一个SCRIPT //replace方法的功能远不止这些,如下面的小技巧 var quote = /"([^"]*)"/;//匹配所有被""包围的字符串 text.replace(quote,' ”$1“ ');//将会把应为的引号换位中文的引号,$1表示第一个() //关于其他replace特点以后在做描述
3.3 match() 只有一个正则表达式的参数,返回一个由匹配结果组成的数组
//当有g修饰的时候,返回所有结果的数组 var array ='1 is not 2 is not 3'.match(/\d+/g);//['1','2','3'] //当没有g修饰啥时候,返回的依然是一个数组,但只匹配第一个,余下的元素是正则表达式中用圆括号括起来的子表达式 //匹配URL var urlP = /(\w+):\/\/([\w.]+)\/(\s*)/; var text ='my blog is http://www.cnblogs.com/wychytu'; var result = text.match(urlP); if(result){ var fulurl = result[0];//匹配到的第一个url,完整大url var u1 = result[1];//http var u2 = result[2];//www.cnblogs.com var u3 = result[3];//wychytu }
3.4 split() 多用于把一个字符串拆分成数组,其参数也可以是正则表达式
var text = '1 , 2 ,3 ,4'; text.split(/\s*,\s*/);//['1','2','3','4']
4.RegExp对象及其方法(2个)
RegExp的属性有5个:source正则表达式的文本;global布尔型,是否带有修饰符g;ignoreCase布尔型,是否带有修饰符i;multiline布尔型,是否带有m修饰符;lastIndex下一次检索的位置,可读可写
4.1 exec() 与match()方法相似,不同之处是,当同一个正则表达式调用第二次exec时,将从上次的lastIndex位置开始
while((result = pattern.exec(text)) != null){ alert(result[0] + result.index +pattern.lastIndex); }
4.2 test()与exec()相同,exec返回值不是null是,text返回true
注意:要遍历一个字符串,挨个进行,使用RegExt比较灵活,注意使用好lastIndex属性