正则表达式的两种写法
// 1.使用正则表达式字面量
适用于确定不变的正则表达式
/pattern/flags
- pattern 正则的表达式部分
- flags 表示标志属性
// 2.使用 RegExp 对象
适用于不确定的正则表达式
new RegExp(pattern[,flags])
正则表达式的匹配方法
// 1.直接匹配
/ ** /
*的位置直接给出要匹配的字符
匹配出字符串的 a
let str = "abc abbc acbb abcd abbbc"
console.log(str.match(/abc/g));
['abc','abc']
// 2.使用特殊字符
/ab*c/
匹配出包含a,0或多个b,c *只决定他前面的一个字符是0个或者多个
let str = "abc abbc acbb abcd abbbc"
console.log(str.match(/ab*c/g));
['abc','abbc','ac','abc','abbbc']
正则表达式基础
let reg = RegExp();
let str = "abc abbc acbb abcd abbbc"
// 1.字符串和RegExp的方法
- reg.exec(pattern[,flags)
- 参数为字符串,返回匹配结果数组,不匹配则返回null,每执行一次exec就向后匹配一次
- 如果带有全局 g 则下一次的exec执行从上一次的结果之后开始查找
- 加上扩或后可以匹配组结果,即整体匹配的结果中可以去除部分结果
reg.exec(/a(b*)c/g) 则返回 0.abc 1.b ,即可以单独返回括号内的内容
- reg.test(pattern)
- 返回一个boolean值,检测是否匹配成功
- str.match(pattern)
- 与reg.exec相似,如果使用g选项,则一次性返回所有匹配结果
- str.search(pattern)
- 返回查找字符串所出现的第一个位置
- str.replace(pattern,str)
- 替换,用第二个参数替换第一个参数匹配到的结果,他不会替换原字符串,而是产生新字符串
let str2 = str.replace('/c/g','x') //将str中的所有c替换为x
- str.split(pattern[,maxLength])
- 切割字符串,第二个参数可以返回最大的返回结果数量
let str3 = str.split(/b+/); //将字符串按一个b或多个b切割
// 2.img选项
- i 忽略大小写匹配
- m 多行模式
- g 全局匹配
console.log(str.match(/ab/gi)) //忽略大小写查找所有ab
// 3.次数
- {n}
//前面的字符出现正好n次,下面的例子即忽略大小写匹配 aab
console.log(str.match(/a{2}b/gi))
- {n,m}
//前面的字符至少n次,最多m次,m可省略,表示最多不限。下面表示匹配1个a或者2个a或者3个a
console.log(str.match(/a{1,3}/gi))
- {+}
//匹配前一个字符一次或多次,等价于{1,n}
- {*}
//匹配前一个字符0次或多次,等价于{0,n}
- {?}
//匹配前一个表达式0次或1次,等价于{0,1},如果在量词后面出现 ?,则会把当前的量词改为非贪婪模式,默认是贪婪模式
// 下面例子即找出字符串中的一个或多个a
str = 'aaAbAa'
console.log(str.match(/a+/gi))
['aaA','Aa']
console.log(str.match(/a+?/gi))
['a','a','A','A','a']
第一次为贪婪的,即匹配到符合的最大限度,在上面的情况下,一个或多个a就一直匹配到最后一个a再返回结果,当匹配到第三个b时不满足,所以前面三个a满足条件,当成一个,后面的Aa同理
第二次为非贪婪的,即只要符合条件,就立即返回结果,匹配到第一个a时,满足条件,返回结果,继续匹配第二个a,满足则返回结果,所以打印结果如上面所示
正则表达式特殊字符
// 1.\
- \b 单词边界
let str = 'hello world helloworld worldhello'
- 匹配hello
console.log(str.match(/hello/g))
['hello','hello','hello']
- 匹配hello,但hello前后都是单词边界,所以上面字符串中的helloworld,worldhello就匹配不到了,仅输出第一个hello
console.log(str.match(/\bhello\b/g))
['hello']
- 匹配hello,且后面是单词边界所以上面匹配到hello,worldhello
console.log(str.match(/hello\b/g))
['hello','hello']
- 匹配hello,且前面是单词边界所以上面匹配到hello,helloworld
console.log(str.match(/\bhello/g))
['hello','hello']
- \\转义字符
如果想匹配 * 这样的具有特殊含义的字符,需要在前面加上\来转义
- \B 非单词边界
- \d 数字
- \D 非数字
- \r 回车,指光标移到行首
- \n 换行,光标移到下一行行首
- \s 匹配空白字符,包括空格,tab,换行符,换叶符等等
- \S 匹配非空白字符
- \w 匹配一个单字字符(数字,字符,下划线),下面例子中,匹配所有的数字,字符,下划线
let str = "wad*dsj(23+22&s12"
console.log(str.match(/w+/g))
['wad','dsj','23','22','s12']
- \W 非单字字符
// 2.^
- 字符串的开始,一般应用到多行模式
let str = "baaa"
console.log(str.match(/^b/g))
['baaa']
多行模式指的是,输入框的换行
let str = "abc def
abc def
def abc"
上面即为三行文本,下面为匹配每一行以abc开始m表示多行模式
console.log(str.match(/^abc/gm))
// 3.$
- 字符串的结束,同上一个一般应用到多行模式
// 4..
- 匹配除了换行符的任何一个字符
let str = "abbc abc afc"
console.log(str.match(/a.c/g))
['abc','afc']
// 5.() 匹配并捕获
- 不加括号只匹配一个字母,加括号匹配一组
let str = "abcabc"
console.log(str.match(/(abc)+/g))
['abcabc','abc']
//前一个abcabc即为匹配结果,后面即为捕获的结果
- 分组的应用
let str = "ab cd ab cd"
console.log(str.match(/(ab) (cd) (\1) (\2)))
['ab cd ab cd','ab','cd','ab','cd']
上面意思即匹配 (ab),(cd)之后,使用\1 \2等即可代替之前的分组,所以输出匹配到的字符,然后输出捕获的四个分组,可以用来匹配html标签
- replace下的分组
let str = "ab cd"
console.log(str.replace(/(\w+) (\w+)/,"$2 $1")
[cd ab]
上面代码实现了字符的换位,前面的正则部分,匹配两个单词,\w表示字符数字下划线,所以匹配出两个单词,在后面使用取分组时,在正则表达式内部使用\1 \2,在正则表达式外部,需使用 $1 &2
- 在分组时,使用g参数,则match操作 取消捕获分组
let str = "abcd"
console.log(str.replace(/(d)/g)
['d']
上面例子中,正常情况下会匹配到d并把d这个分组放到数组中的下一项,但加了g之后就不会捕获分组如果想要捕获分组,则使用exec来实现,如下
let reg = new RegExp("(d)","g")
console.log(reg.exec(str))
// 6.(?:x)
- 匹配且不捕获
let str = "abc"
console.log(str.match(/(?:b)/)
['b']
因为捕获分组的数量仅有9个,从\1 - \9,所以有些分组不希望成为捕获括号,则括号前面加上?:即可,如上面所示
// 7.(?=)
- 匹配某一项后面必须是某一个值
let str = "abc abd"
console.log(str.match(/ab(?=c)/)
['ab']
即匹配ab,且ab后面必须是c的,所以abd即不符合情况
// 8.(?!)
- 匹配某一项后面必须不是某一个值,使用方法同上
// 9.x|y
- 匹配某一项或另一项
let str = "abc abd"
console.log(str.match(/ab(c|d)/)
['ab','ab']
即匹配ab,且ab后面是c或者d的,所以匹配两项结果
// 10.[]
- 多项或
let str = "ab ac ad ae aa"
console.log(str.match(/a[cde]/g)
['ac','ad','ae']
即匹配a后面可以是c或d或e
- [0-9]
let str = "a23b"
console.log(str.match(/a[0-9]+b/g)
['a23b']
短杠表示范围,上面表示匹配a 1个或多个数字 b
数字也可使用 \d来匹配,[a-z]即表示小写字母
[a-zA-Z]即表示字母,括号已经表示或者的关系,所以不用加 |
- [^a]
^ 表示非,[^abc]即表示不是a,也不是b,也不是c
参考链接