1 为何要用正则表达式?
进修之前,多想想为何要运用正则表达式,有助于明白。
正则表达式
regular expression
运用单个字符串来形貌某个句法划定规矩,计算机依据划定规矩去婚配字符串中的内容。
正则表达式的机能高于通例字符串操纵(省略轮回、遍历等操纵)
正则表达式仅用于字符串的操纵
2 通例字符串操纵与正则表达式的比较
要提掏出字符串中'ashx521dasbx34sasdz275dasdzxd897'
中一连的数字,并将效果保留在数组中['521', '34', '275', '897']
传统字符串操纵:须要遍历全部字符串,推断每一个字符是不是在
'0'-'9'
之间再举行响应的操纵/** * 运用一个临时变量tmp保留一连为数值时的字符串,间断后再一致到场数组内; * 能够会涌现末了一名是数字的状况,所以运用i<=str.length多走一次轮回的else途径,将末了一组数组到场数组 * */ function findNum_two(str) { var arr = []; var tmp = ''; // 遍历字符串,掏出须要的数字 for(var i=0; i<=str.length; i++) { if(str.charAt(i) <= '9' && str.charAt(i) >= '0') { tmp += str[i]; } else { if(tmp) { // 假如tmp不为空 arr.push(tmp); tmp = ''; } } } return arr; } console.log(findNum_two(str)); // [ '521', '34', '275', '897' ]
运用正则表达式:只需运用字符串的
match()
要领去婚配指定的划定规矩(正则表达式即可)function findNum (str) { return str.match(/\d+/g); } console.log(findNum(str)); // [ '521', '34', '275', '897' ]
3 正则表达式写法
字面量写法:
var re = /\d+/gi;
组织函数写法:
var re = new RegExp('\\d+', 'gi');
注重两个\\
,由于JavaScript中\
须要转义
3.1 正则表达式中的转义字符
转义字符:零丁运用字母自身有意义;在前面加上
\
后转变原有意义
3.2 量词
用来形貌相邻的前面的单个字符婚配划定规矩涌现的次数
量词运用
{a, b}
示意,个中b
能够省略,意义差别
3.3 字符类
运用
[]
形貌一类字符,团体只代表一个字符,示意该字符在某个局限内。/a[0-9]c/
婚配三位字符串,第一名是a
,第三位是c
,第二位是'0'-'9'
之间的任何一名都能够婚配胜利[]
多种划定规矩是或 |
的关联:[0-9a-zA-Z]
等
全部字符类
[0-9a-zA-Z]
只代表一名字符
注重,字符类中的^
示意非的意义,不在某个局限内:[^\d]
示意非数字的字符
3.4 修饰符
g
—global
:全局婚配,找到一切的婚配项,不是在第一个婚配后住手i
—ignored
:疏忽大小写m
:多行,将最先字符^
和完毕字符$
视为在多行上事情(每婚配一行的最先和完毕以\n
和\r
支解)u
:将形式视为Unicode序列点的序列
3.5 婚配子项
关于庞杂的正则表达式,能够运用
()
将其拆分为多个部份,在replace(re, fn)
回调函数中能够简化婚配内容的操纵
var re = /(\d+)(\w)(\S)/;
fn($0, $1, $2 ...)
$0
代表正则表达式自身婚配到的内容:(\d+)(\w)(\S)
$1
代表正则表达式的第一个婚配子项:(\d+)
$2
代表正则表达式第二个婚配子项:(\w)
…
3.6 反复子项
重要用于婚配字符串中反复的字符
var re = /(a)(b)(c)\1/;
:\1
示意反复的第一个子项(b)
,第4个位置的字符与第1个位置的字符雷同var re = /(a)(b)(c)\2/;
:\2
示意反复的第二个子项(b)
,第4个位置的字符与第2个位置的字符雷同var re = /(a)(b)(c)\3/;
:\3
示意反复的第三个子项(c)
,第4个位置的字符与第3个位置的字符雷同…
3.7 逻辑或|
运用
|
代表逻辑或,|
摆布两个操纵数只要有一个满足要求即可
3.8 最先、完毕标记
不在
[]
中运用^
,^
示意以近来的婚配字符划定规矩最先全部婚配;$
示意以近来的婚配划定规矩完毕婚配
作用局限只是^
以后的第一个子项;$
前的第一个子项
4 正则表达式的要领
重要有4中要领用于操纵正则表达式:
match()
、replace()
、search()
是字符串的操纵要领test()
、exec()
是正则表达式对象的操纵要领
4.1 test()
依据
RegExp
去婚配字符串,假如婚配胜利,返回true
;婚配失利返回false
。重要用于逻辑推断
var str = "abxe2312dafxz";
var re = /\d+/;
re.test(str); // true
4.2 search()
依据
RegExp
去婚配字符串,返回第一个婚配胜利字符串的首字符的索引;婚配失利返回-1
。用于查找字符的索引,相似字符串的indexOf()
要领
str.search(re)
4.3 match()
依据
RegExp
去婚配字符串,假如婚配胜利,将婚配的效果保留在数组中返回;婚配失利返回null
。默许第一次婚配后便住手继承婚配,运用修饰符g
举行全局婚配
str.match(re)
4.4 replace(re, newstr)
要领
依据
RegExp
去婚配字符串,假如婚配胜利,将婚配的字符串更换为新的字符串newstr
。
replace()
要领的参数re
正则表达式是变量,必需运用new RegExp()
体式格局建立re
var str = 'a23gb';
var re = /\d+/;
str.replace(re, "xy"); // 'axygb'
replace()
要领的第二个参数能够是回调函数,其参数是每次婚配胜利猎取的字符串。每次婚配胜利都邑实行一次回调函数
5 实践
5.1 找到一个字符串中涌现次数最多的字符及其涌现的次数
var str = '1231asdaegj71836178asdhasssasalsdhdzxbczaslazxcnnffajshdhgagsgdssssasdzzxda';
var str = str.split('').sort().join(''); // 按递次的字符序列
var re = /(\w)\1+/g;
var length = 0;
var val = ''; // 保留涌现次数最多的字符
// $0代表每次婚配到的字符,$1代表第一个正则表达式子项(\w)
str.replace(re, function ($0, $1) { // 能够将婚配的字符当作变量操纵
if($0.length > length) {
length = $0.length;
val = $1; // $1代表每次婚配的字符
}
});
console.log(length);
console.log(val);
5.2 去掉字符串前后的空格
var re = /^\s+|\s+$/g;
,运用字符串运用正则即可:str.replace(re, '')
5.3 经常使用正则婚配划定规矩
QQ号:
var re = /^[1-9]\d{4,11}$/;
:第一名是1-9中的数字,末了也是数字,统共5-12位中文婚配:
var re = /[\u4e00-\u9fa5]/;
:运用Unicode编码举行婚配email
:var re = /\w+@[a-z0-9]+(\.[a-z]+){1,3}/;
:能够涌现.com.cn.net
身份证:
var re = /[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x/i;
邮编:
var re = /[1-9]\d{5}/;
5.3 将经常使用正则表达式封装在一个对象中便于运用
var re = {
email: /\w+@[a-z0-9]+(\.[a-z]+){1,3}/,
chinese: /[\u4e00-\u9fa5]/,
qq: /^[1-9]\d{4,11}$/,
id: /[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x/i,
trim: /^\s+|\s+$/
}