[1]定义:正则又叫规则或模式,是一个强大的字符串匹配工具,在javascript中是一个对象
[2]特性:
[2.1]贪婪性,匹配最长的
[2.2]懒惰性,不设置/g,则只匹配第1个
[3]两种写法:
[3.1]perl写法(使用字面量形式): var expression = /pattern/flags;
e.g. var pattern = /a/i;//匹配字符串中所有'a'的实例
[3.1.1]三个标志flags
[a]g:表示全局模式(global)
[b]i:表示不区分大小写(ignoreCase)
[c]m:表示多行模式(multiline)
[3.2]js写法(使用RegExp构造函数):两个参数:要匹配的字符串模式、标志字符串(可选)
e.g. var pattern = new RegExp('[bc]at','i');
[注意]RegExp构造函数的两个参数都是字符串
[3.3]构造函数与字面量的区别
[注意]可以使用字面量形式定义的任何表达式,都可以使用构造函数来定义
[3.3.1]字面量写法不支持变量,只能用构造函数的形式来写
[tips]获取class元素(因为classname是变量,只能使用构造函数的形式)
function getByClass(obj,classname){ var elements = obj.getElementsByTagName('*'); var result = []; var pattern = new RegExp( '^|\\s'+ classname + '\\s|$'); for(var i = 0; i < elements.length; i++){ if(pattern.test(elements[i].className)){ result.push(elements[i]); } } }
[3.3.2]在ECMAScript3中,正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例
var re = null, i; for(i = 0; i < 10; i++){ re = /cat/g; re.test('catastrophe'); } for(i = 0; i < 10; i++){ re = new RegExp('cat','g'); re.test('catastrophe'); }
[3.3.3]ECMAScript5中规定,使用正则表达式字面量必须像直接调用RegExp构造函数一样,每次都创建新的RegExp实例
[4]语法
[重要事项]正则表达式中不能出现多余空格
[4.0]元字符(14个):() [] {} \ ^ $ | ? * + .
[注意]元字符必须转义,即用\ 加转义字符,用new RegExp写的正则必须双重转义
[4.1]转义字符
[4.1.0].号代表除了换行符\n之外的任意字符
[4.1.1]\d 数字 \D 非数字
[4.1.2]\w 字母、数字、下划线 \W 非字母、数字、下划线
[注意]汉字不属于\w
[4.1.3]\s 空格 \S 非空格
[4.1.4]\b 边界符,\w的左侧或右侧不是\w,则会出现一个边界符 \B非边界符
[4.1.5]\1 表示和前面相同的一个字符
[tips]找出重复项最多的字符和个数
var str = 'aaaaabbbbbdddddaaaaaaaffffffffffffffffffgggggcccccce'; var pattern = /(\w)\1+/g; var maxLength = 0; var maxValue = ''; var result = str.replace(pattern,function(match,match1,pos,originalText){ if(match.length > maxLength){ maxLength = match.length; maxValue = match1; } }) console.log(maxLength,maxValue);//18 "f"
[4.1.6](\w)(\d)\1\2 :\1代表\w当时所代表的值,\2代表\d当时所代表的值
[注意]正则表达式中的子项必须是用小括号括起来的,并且顺序以小括号的前括号出现的顺序为准
[4.1.7]\t 制表符
[4.1.8]\v 垂直制表符
[4.1.9]\uxxxx 查找以十六进制xxxx规定的Unicode字符
[注意1][\u4e00-\u9fa5]代表中文
[注意2]alert()和console.log()里面的字符是系统转义字符
[a]\r return 回车
[b]\n newline 换行
[c]\t table 制表符
[d]\b backspace 退格
[tips]alert里的换行不能用<br>或<br\>,而应该用\n。alert里面相当于是系统解析的,而不是浏览器
e.g.alert('http://www.baidu.com\n\t你好')
[注意3]由于RegExp构造函数的参数是字符串,所以某些情况下,需要对字符进行双重转义。所有元字符必须双重转义,已经转义过的字符也必须双重转义
//字面量模式 -> 等价的字符串 // /\[bc\]at/ "\\[bc\\]at" // /\.at/ "\\.at" // /name\/age/ "name\\/age" // /\d.\d{1,2}/ "\\d.\\d{1,2}" // /\w\\hello\\123/ "\\w\\\\hello\\\\123"
[4.2]量词
[4.2.1]{n}:匹配n次
[4.2.2]{n,m}:匹配至少n次,最多m次
[4.2.3]{n,}:匹配至少n次
[4.2.4]?:相当于{0,1}
[4.2.5]*:相当于{0,}
[4.2.6]+:相当于{1,}
[4.3]位置符号
[4.3.1]^起始符号
[4.3.2]结束符号为美元符号
[4.3.3]?=肯定正向环视
[4.3.4]?!否定正向环视
[4.4]控制符号([]:候选 |:或 ^:非 -:到)
[4.4.1](red|blue|green) 查找任何指定的选项
[4.4.2][abc] 查找方括号之间的任何字符
[4.4.3][^abc] 查找任何不在方括号之间的字符
[4.4.4][0-9] 查找任何从0到9的数字
[4.4.5][a-z] 查找任何从小写a到小写z的字符
[4.4.6][A-Z] 查找任何从大写A到大写Z的字符
[4.4.7][A-z] 查找任何从大写A到小写z的字符
[4.4.8][adgk] 查找给定集合内的任何字符
[4.4.9][^adgk] 查找给定集合外的任何字符
[4.5]美元符号