一般情况下,正则表达式所作的三件事是:
1.测试字符串的某个模式。例如:当用户通过表单提交了个人信息,有邮编、电话、Email等等,通过正则可以判断这些数据是否满足相应的格式。这个叫做数据的有效性验证;
2.替换文本。可以在文档中标识某种特定的字符串,然后将其替换为空或者其他的字符串。
3.提取字符串。将满足正则的子字符串提取出来,保存在数组中。
正则表达式的语法就不贴出来了,许多地方都能找到。
下面介绍如何在JavaScript中使用正则表达式。
需要了解的基础有:
. * ? + [] {} () | ^ $ 几种元字符的用法;
还有常见的组合: [a-z] [A-Z] [0-9] [^x]
以及: \d \w \s \D \W \S \b
捕获: () (?: )
反向引用:\1
js的正则表达式使用: /\d+/ /\w+/i /\w+/g …… 这种写法和使用RegExp类的区别;
js正则相关的函数的使用: test 、match、search 、exec 、replace 、split。
1.创建。
RegExp对象构造方式:
var re = new RegExp("gx");
var re = new RegExp("gx","gim");
g:global,表示找到所有的匹配,如果不指定g选项,只匹配第一个
i:不区分大小写
m:匹配多行
字面量方式:
var re = /gx/;
var re = /gx/i;
两者区别:
非字面量来表达正则表达式时,对元字符转义必须用双重转义,而字面量不用,eg:
var re = /\?/; // ?为元字符必须转义
var re = new RegExp('\\?'); // 因为RegExp是用字符串来构造,而\必须也转义,故得写成 '\\?'
元字符有: (、[、{、\、^、$、|、)、?、*、+ 、 (其中、为分隔符)
2.常用方法。
可以参考http://www.w3school.com.cn/js/jsref_obj_regexp.asp 。
3.模式。
二、简单模式
1、元字符
(、[、{、\、^、$、|、)、?、*、+、.
2、使用特殊字符
用ascii码和unicode表示字符
\t 制表符
\n 换行符
\r 回车符
\f 换页符
\a alert字符
\e escape字符
\cX 与X相对应的控制字符
\b 回退字符
\v 垂直制表符
\0 空字符
以上特殊字符用非字面量方式构造表达式时,要双重转义
3、字符类
简单类:[]来表示单个字符有或的关系,如/[bc]/,匹配b或者c
负向类:^来表示不匹配后面跟着的字符,如/[^bc],/不匹配b或c
范围类:-来表示一个范围,如/[a-z]/,匹配a-z的字母,可以和负向类结合/^0-9/
组合类:以上几种类组合而成的字符类,如/a-z0-9\n/,匹配a-z的字母或者0-9的数字或者换行符
类不能嵌套,就是不支持联合类和交叉类,/a-m[p-z]/和/a-m[^b-e]/在JavaScript中是非法的
预定义类:
. = [^\n\r] 除了换行和回车之外的任何字符
\d = [0-9] 数字
\D = [^0-9] 非数字
\s = [ \t\n\x0B\f\r] 空白字符
\S = [^ \t\n\x0B\f\r] 非空白字符
\w = [a-zA-Z_0-9] 单词字符(字母、数字、下划线)
\w = [^a-zA-Z_0-9] 非单词字符
4、量词:某个模式出现的次数
简单量词:
? 出现0或1次
* 出现0或多次
+ 出现1或多次(至少1次)
{n} =n次
{n,m} >=n,<=m
{n,} >=n
贪婪量词:先匹配整个字符串,如果不匹配则去掉最后一个字符再匹配,直到没有任何字符。所有简单量词都是贪婪的。
惰性量词:和贪婪量词相反,即先匹配第一个字符,不匹配则匹配第一第二个字符,直到最后整个字符串。所有简单量词后面加?就是惰性的了。
支配量词:只匹配整个字符串一次,不匹配就结束。所有简单量词后面加+就是支配的了。
三、复杂模式
1、分组:用括号来包括一些字符、字符类、量词来使用的。个人理解为可以将字符、字符类、量词等用括号来组成一个单元,可以对这个单元使用量词,同时这个单元是被存储起来的。分组可以嵌套。
2、反向引用:每个分组都是被存储起来的,存储在分组中的匹配值称为反向引用。
使用正则表达式的test、match、search方法之后,可以通过正则表达式的实例变量来访问到反向引用。RegExp.$1,RegExp.$2...来访问反向引用。
可以直接在分组表达式中使用分组。eg:var re = /dog\1/,转义\1就引用了第一个反向引用
可以在String的replace方法中通过特殊的序列$1、$2来访问反向引用。eg:var sToChange = '1234 5678';var reMatch = /(\d{4}) (\d4)/;var sNew = sToChange.replace(reMatch,'$2 $1');很轻松的实现单词的顺序转换。
3、候选:用|来表示模式的或关系。
4、非捕获性分组:创建反向引用的分组是捕获性分组,不创建反向引用的分组就是非捕获性分组。eg:(?:bad)
5、前瞻:某个特定的字符分组出现在另一个字符串之前时才捕获,正向前瞻要放在(?=和)之间(不是分组),负向前瞻放在(?!和)之间。eg:/ (bed(?=room))/匹配跟在room前面的bed;/(bed(?!room))/匹配不跟在room前的bed。
6、边界:^行开头,$行结尾,\b单词边界,\B非单词边界。
7、多行模式:m选项打开,能影响^和$,使^匹配开头和换行符后面的位置,$匹配真正的结尾和换行符。
4.习题。
1.匹配以字符开头,后面可能有数字结尾的用户名,首字母可为大小写,其他字母为小写,如 momo1231、 jay087、 Mary、 Peter84;(可用test函数);
2.匹配一个电信手机号,电信手机号有189、133、153、180、1349开头。(可用test函数; 思考:如果是多个电信手机号用逗号分隔,又该如何匹配呢?)
3.匹配3个重复数字的序列,比如123123、340340、881881.(可用test函数、反向引用)
4.从一行英文句子中提取每个单词,如“It's OK any time” (可用exec或split捕获)
5.从一个url中提取一个参数的值出来,如“http://xxx.com:8000/index.php?op=addMeida&media_id=12345&user_id=99&type=video”中提取出media_id的值“12345”,保存到一个变量中alert出来。(可用exec实现,或者search、match; 思考:想想如果想封装成函数,可以传入参数名来来提取任意参数的值应该怎么办?)
6.解析一行csv文件,放到一个数组里,记得要去掉每一列可能自动添加的双引号 (可用split以及replace函数配合)
7.把一段html文本的html标记去掉,把换行标记<p>和<br/>替换成换行符\n,即从html源码中提取出纯文本。(可用replace实现)
想学的朋友可以把答案贴出来,大家一起学习谈论。
来源:https://www.cnblogs.com/xianggao/archive/2010/07/04/1770966.html