正则表达式(regular expression)
描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符",如$,(),*,?,组成的文字模式。
表达式字符
-
普通字符
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。 -
非打印字符
\n 匹配一个换行符
\r 匹配一个回车符
\s 匹配任何空白字符,包括空格、制表符、换页符等等
\S 匹配任何非空白字符
\t 匹配一个制表符 -
特殊字符
匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符 () 放在它们前面
如:*、+、()、| -
限定符
用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
有*、+、?、{n}、{n,}、{n,m}共6种 -
定位符
定位符用来描述字符串或单词的边界,不能将限定符与定位符一起使用
^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界
次数
- { }括号
有一个数代表需出现几次,如:/a{2}/ /aa/;或者如{2,}代表最少出现2次
有两个数,如{2,5 }代表最少2次,最多5次 - [ ]括起来的叫字符集合
[abc]匹配出a或b或e
[abc][ abc]匹配出abe三者两两组合的所有条件,如aa,ab,bc
[abc]{2}匹配结果和上同
[^abc]匹配不包含a b c ; 当在一组方括号里使用^是,它表示"非"或"排除"的意思
注:/([a-z])([a-z]).\1/g; 不等于 /([a-z]){2}.\1/g;
前者\1代表引用第一个小括号匹配到的字符;
后者的\1代表引用第一个括号最后一次匹配到的字符,按照上例为第二个 - ? :0或1次; * :0或多次; + :1或多次;
- ? :当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
- 界限
^: 以什么开始 $: 以什么结尾
运算符优先级
优先级递减
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \ 任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,"或"操作
正则表达式查找过程详解
var str=’abbhelol’;
查找字符串 ’bh’ ,第一次查ab,不符合;第二次查找bb,不符合;第三次查找bh,符合;第四次查el,因为之前查到了bh,所以不会查he而是el;继续以上步骤
正则表达式的构建
- 构造函数
var pattern=new RegExp(‘hi’,‘ig’); console.log(pattern); - 字面量(双斜杠内代表表达式内容,ig代表修饰符)
var pattern=/hi/ig; console.log(pattern);
修饰符:
g:全局匹配
i:不区分大小写
m:多行匹配
g i m可随意搭配,如gi、gm、ig、igm
正则表达式对象的属性和方法
var pattern=/hi/ig;
- pattern.global; 判断是否是全局匹配
- pattern.ignoreCase 是否忽略大小写
- pattern.multiline 是否多行匹配
- pattern.source 正则表达式的文本内容
- pattern.lastIndex 下次检索的位置
有g修饰符修饰会维护lastIndex;没有lastIndex永远都是0 - test() 检测字符串str中是否符合正则表达式规则的字符串,是返回true
console.log(pattern.test(str)); - exec() 获取匹配到的字符串,将其返回数组,若未找到则返null,每次只找一个
console.log(pattern.exec(str));
字符串String方法
- match() 加了g返回所有符合条件的元素组成的数组,不加g,只返回第一个
console.log(str.match(pattern)); - search() 匹配字符串找到就返回位置,找不到返回-1
console.log(str.search(pattern)); - replace() 将所有某个字符串替换成另一个字符串,不改变原字符串,返回更改后的字符串
var str=‘hello hello wor hello world’;
var res=str.replace(/hello/ig,‘JavaScript’);
console.log(res); - split() 返回数组
var str=‘12&34&45’;
console.log(str.split(’&’)); [ ‘12’, ‘34’, ‘45’ ]
console.log(str.split(/&/)); [ ‘12’, ‘34’, ‘45’ ]
console.log(str.split(’’)); [ ‘1’, ‘2’, ‘&’, ‘3’, ‘4’, ‘&’, ‘4’, ‘5’ ]