语法
var reg = new RegExp(pattern, modifiers) 或者更简单的方式: var reg = /pattern/modifiers
pattern(模式)描述了表达式的模式
modifiers(修饰符)用于指定全局匹配、区分大小写的匹配和多行匹配
注意:当使用构造函数(new RegExp())创建正则对象时,需要常规的字符转义规则(在前面加反斜杠)。比如,以下是等价的
var reg = new RegExp('\d+'); var reg = /d+/;
常用方法
reg.test(str) => 按照规则校验字符串是否符合,返回true/false
str.match(reg) => 在字符串中按照规则查找,返回数组
str.search(reg) => 在字符串中按照规则查找,返回(第一个符合条件的)下标
注:str是字符串,reg是正则表达式
修饰符(可随意组合)
i 执行对大小写不敏感(不区分)的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
注意事项: m修饰符的作用是修改^和$在正则表达式中的作用,让它们分别表示行首和行尾。
在默认状态下,一个字符串无论是否存在换行符(
)只有一个开始^和结尾$,如果采用多行匹配,那么每一个换行符(
)都有一个^和结尾$。
var str = 'This TEACHER is very good at teaching. Students like her VERY much.'
var reg = /er/
console.log(str.match(reg)) //[er] => (very)
var reg1 = /er/i
console.log(str.match(reg1)) //[ER] => (TEACHER)
var reg2 = /er/g
console.log(str.match(reg2)) //[er, er] => (very, her)
var reg3 = /er$/m
console.log(str.match(reg3)) //null
var reg4 = /er/ig
console.log(str.match(reg4)) //[ER, er, er, ER] => (TEACHER, very, her, VERY)
var reg5 = /er$/im
console.log(str.match(reg5)) //null
var reg6 = /er$/gm
console.log(str.match(reg6)) //null
var reg7 = /er$/igm
console.log(str.match(reg7)) //null
第一种,无修饰符,将匹配 'er' ,如果匹配到就显示,匹配不到显示null
第二种,加了修饰符i,不区分大小,即可以匹配的类型应该有 'er' , 'eR' , 'Er' , 'ER'
第三种,加了修饰符g,全局匹配,即将所有 'er' 找出来
第四种,加了修饰符m,多行匹配,上面注意事项介绍了,在js代码中 ‘ ’ 是换行符,修饰符m只对 开头'^'和结尾'$' 这两种量词进行多行匹配,即在使用修饰符m的情况下,碰到 ' ' 后,就相当于在其前多了一个结尾 '$',在其后面多了一个开头 ‘^’,这样说可能不够清楚,看下面分析,将上面demo拿来具体问题具体分析
var str = 'This TEACHER is very good at teaching.
Students like her VERY much.'
var reg3 = /er$/m
console.log(str.match(reg3)) //null
其实,一开始看到结果是null,我也是一愣,匹配不到?好吧,分析看看,请看我上面说的(红色字体或者查看注意事项),恩,' '?在str里面是存在,那么根据上面的意思,上面的代码在修饰符m的作用下就变成,下面用截图来展示
看到我上面截图加的结尾符和开头符,是不是有点理解了呢,恩,那么开始按照匹配条件进行匹配, 'er$' , 字符串(str)中最后以$结束前两位字符是'er'的有吗?并没有符合要求的,所以就返回null,如果换成英文的小数点 'g.'或 'h.' 就可找到,不信的可以试试。
var str = 'This TEACHER is very good at teaching. Students like her VERY much.' var reg3 = /g.$/m console.log(str.match(reg3)) // [ 'g.' ] => (teaching.) var str = 'This TEACHER is very good at teaching. Students like her VERY much.' var reg3 = /h.$/m console.log(str.match(reg3)) // [ 'h.' ] => (much.)
相信,前面这几种分析完后,后面的大家一看就能够明白,后面的就不浪费口舌了,大家自行消化。(相信大家都是大牛,不用来看我写的博客)
方括号
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
(red|blue|green) 查找任何指定的选项。
// [abc]: var str = 'this is RegExp grammar' var reg = /[a-g]/g console.log(str.match(reg)) // // [^abc]: var str = 'this is RegExp grammar' var reg = /[^a-g]/g console.log(str.match(reg)) // ["t", "h", "i", "s", " ", "i", "s", " ", "R", "E", "x", "p", " ", "r", "m", "m", "r"] // [0-9]: var str = 'sd12452asdfd' var reg = /[0-9]/g console.log(str.match(reg)) // ["1", "2", "4", "5", "2"] // [a-z]: var str = 'sd12452asdfd' var reg = /[a-z]/g console.log(str.match(reg)) // ["s", "d", "a", "s", "d", "f", "d"] // [A-Z]: var str = 'sd12452Asdfd' var reg = /[A-Z]/g console.log(str.match(reg)) // ["A"] // (ab|bc|cd): var str = 'abcad' var reg = /(bc|ab|cd)/g console.log(str.match(reg)) // ["ab"]
这些都是很简单的匹配,相信大家一看就能明白。这里就只给出说明和例子,下面开始要集中精神啦。
元字符
. 查找单个字符,除了换行和行结束符。(注:行结束符在Linux和Windows是不同的,Linux是 '
', Windows是 '
',这个需要注意)
w 查找单词字符。(单词字符包括:a-z、A-Z、0-9,以及下划线, 包含 _ (下划线) 字符。)
W 查找非单词字符。
d 查找数字。
D 查找非数字字符。
s 查找空白字符。( ' ', ' ', '
', '
', 'v', 'f')
S 查找非空白字符。
匹配单词边界。(查找位于单词的开头或结尾的匹配。)
B 匹配非单词边界。
查找 NULL 字符。
查找换行符。
f 查找换页符。
查找回车符。
查找制表符。
v 查找垂直制表符。
xxx 查找以八进制数 xxx 规定的字符。
xdd 查找以十六进制数 dd 规定的字符。
uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
上面是说明介绍,下面我们逐一分析
. 查找单个字符,除了换行和行结束符。
// new RegExp('regexp.') or /regexp./ var str = 'That is hot' var reg = /h.t/g console.log(str.match(reg)) // [hat, hot] => (That, hot)
var str = 'Tha t is hot'
var reg = /.t/g
console.log(str.match(reg)) // [ot] => (hot)
w 查找单词字符。单词字符包括:a-z、A-Z、0-9,以及下划线, 包含 _ (下划线) 字符。
// new RegExp('w') or /w/ var str = 'this is word, this is ¥' var reg = /w/ console.log(str.match(reg)) // [t] var reg = /w/g console.log(str.match(reg)) // ["t", "h", "i", "s", "i", "s", "w", "o", "r", "d", "t", "h", "i", "s", "i", "s"]
W 查找非单词字符。单词字符包括:a-z、A-Z、0-9,以及下划线, 包含 _ (下划线) 字符。
// new RegExp('W') or /W/ var str = 'this is word, this is ¥' var reg = /W/ console.log(str.match(reg)) // [ '' ] var reg = /W/g console.log(str.match(reg)) // [ ' ', ' ', ',', ' ', ' ', ' ', '¥' ]
d 查找数字。
// new RegExp('d') or /d/ var str = 'please pay me 100' var reg = /d/g console.log(str.match(reg)) // [ "1", "0", "0" ]
D 查找非数字字符。
// new RegExp('D') or /D/ var str = 'please pay me 100' var reg = /D/g console.log(str.match(reg)) // ["p", "l", "e", "a", "s", "e", " ", "p", "a", "y", " ", "m", "e", " "]
s 查找空白字符。
// 空格符 => ' ' (space character) // 制表符 => ' ' (tab character) // 回车符 => ' ' (carriage return character) // 换行符 => ' ' (new line character) // 垂直换行符 => 'v' (vertical tab character) // 换页符 => 'f' (form feed character) // new RegExp('s') or /s/
var str = '
vf'
var reg = /s/g
console.log(str.match(reg))
结果在谷歌和火狐的展示是不同的,但是结果是一样的。
谷歌:
火狐:
S 查找非空白字符。
// 空格符 (space character) // 制表符 (tab character) // 回车符 (carriage return character) // 换行符 (new line character) // 垂直换行符 (vertical tab character) // 换页符 (form feed character) // new RegExp('s') or /s/ // new RegExp('S') or /S/ var str = 'please pay me 100 ! ' var reg = /S/g console.log(str.match(reg)) // ["p", "l", "e", "a", "s", "e", "p", "a", "y", "m", "e", "1", "0", "0", "!"]
匹配单词边界。查找位于单词的开头或结尾的匹配。
// new RegExp('') or // var str="JavaScript and testJava, thisisJavaScript."; var patt1=/Java/g; //只要以Java开头就能匹配到 var patt2=/Java/g; //只要以Java结束就能匹配到 console.log(str.match(patt1)); // [Java] => (JavaScript) console.log(str.match(patt2)) // [Java] => (testJava)
B 匹配非单词边界。
// new RegExp('B') or /B/ var str="JavaScript and testJava, thisisJavaScript."; var patt1=/BJava/g; //只要不是以Java开头就能匹配到 var patt2=/JavaB/g; //只要不是以Java结束就能匹配到 console.log(str.match(patt1)); //[Java, Java] => (testJava, thisisJavaScript) console.log(str.match(patt2)) //[Java, Java] => (JavaScript, thisisJavaScript)