正则又叫规则或模式,是一个强大的字符串匹配工具。javascript通过RegExp类型来支持正则表达式
特性
[1]贪婪性,匹配最长的
[2]懒惰性,不设置/g,则只匹配第1个
写法
perl写法(使用字面量形式)
var expression = /pattern/flags;
模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符串、限定类、分组、向前查找以及反向引用。每个正则表达式可以带一个或多个标志(flags),用以标明正则表达式的行为。正则表达式支持三个标志:
[1]g:表示全局模式(global)
[2]i:表示不区分大小写(ignoreCase)
[3]m:表示多行模式(multiline)
//匹配字符串所有'at'的实例 var pattern1 = /at/g;
RegExp构造函数
RegExp构造函数接收两个参数:要匹配的字符串模式(pattern)和标志字符串(flags)(可选)
[注意]RegExp构造函数的两个参数都是字符串。且使用字面量形式定义的任何表达式都可使用构造函数
//匹配字符串所有'at'的实例 var pattern = new RegExp('at','g');
两种写法的区别
字面量写法不支持变量,只能用构造函数的形式来写
[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]);
}
}
return result;
}
[注意]ES3中,正则表达式字面量始终共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例。ES5中规定使用正则字面量必须像直接调用RegExp构造函数一样,每次都创建新的RegExp实例
语法
[注意]正则表达式中不能出现多余空格
元字符(14个)
() [] {} \ ^ $ | ? * + .
[注意]元字符必须转义,即用\ 加转义字符,用new RegExp写的正则必须双重转义
转义字符
. 除换行符\n之外的任意字符
\d 数字
\D 非数字
\w 字母、数字、下划线
\W 非字母、数字、下划线(汉字不属于\w)
\s 空格
\S 非空格
\b 边界符(\w的左侧或右侧不是\w,则会出现一个边界符)
\B 非边界符
\1 表示和前面相同的一个字符
\t 制表符
\v 垂直制表符
\uxxxx 查找以十六进制xxxx规定的Unicode字符(\u4e00-\u9fa5代表中文)
(\w)(\d)\1\2 :\1代表\w当时所代表的值,\2代表\d当时所代表的值
[注意]正则表达式中的子项必须是用小括号括起来的,并且顺序以小括号的前括号出现的顺序为准
[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"
系统转义
alert()和console.log()里面的字符是系统转义字符
\0 空字节
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\\ 斜杠
\' 单引号
\" 双引号
\xnn 以十六进制nn表示一个字符(n为0-f),如\x41表示'A'
\unnnn 以十六进制nnnn表示一个Unicode字符(n为0-f),如\u03a3表示希腊字符ε
[注意]alert里面的换行不能用<br>或<br\>,而应该用\n
alert('http://www.baidu.com\n\t你好')
双重转义
由于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"
量词