正则表达式知识点及相关面试题

1.正则表达式

概念:正则表达式就是一个表达式,匹配特殊字符或有特殊字符搭配原则的字符的最佳选择。

2.正则表达式定义的方式

1.var reg = /abc/;//字面量创建相当于和[]创建数组相同,直接创建
2.var reg = new RegExp('abc');使用构造函数创建,第一个参数是规则,第二个参数是属性,参数都写字符串形式的

使用new RegExp 和不使用new的区别在于:不new那么字面量的正则和创建的正则指向同一个人(返回的就是里面的正则表达式的引用) :使用new 那么就不是同一个人。

3.正则表达式使用方法

reg.test(str);测试正则表达式是否被包含在str里面
str.match(reg);字符串的方法,返回字符串匹配正则表达式的值,在不使用全局查找(g)的情况下找到一个就返回的

4. 特殊属性 i/g/m

g代表的是global全局匹配,但是如果多行的话只会匹配第一行
i代表ignoreCase忽略大小写,
m代表multiline多行匹配,

5.特殊字符

\   转义字符
\n 换行
\r  行结束
\t 一个table(4个空格)
\空白 转义空白(换行)用使字符串换行使用
|   或

6.方括号表达式

[]中除-需要转义以外,其他字符都不需要,都能识别
一个[]代表一位,匹配[]中的任意一位
[^]^放在表达式里面就叫非,放外面叫以什么开头
[abc]  查找方括号内的任意一个字符
[^abc]   查找任何不在方括号内的字符
[0-9]  查找0-9之间的数字
[a-z]  查找任何小写字母
[A-Z]  查找任何大写字母
[A-z]  查找任何字母
(red|blue|green)  查找指定字符串(子表达式) | 这个叫或者的意思(ABC|bcd|abc)
()子表达式: /(a)\1/ : \1引用第一个子表达式的内容(反向引用)注意$1表示第一个子表达式的内容
使用该子表达式会把子表达式的内容匹配出来挂上,可以使用console.log(reg.exec(str))查看(str.match也是相同的,在不加g的情况下)

7.量词(代表数量的词)

以下均遵循贪婪匹配:

n+      匹配任何包含至少一个n的字符(这个n可以出现1到无数次)(符合贪婪匹配原则)
n*      匹配任何包含0个或多个n的字符(这个n可以出现0到无数次)
var reg = /\w*/ var str = 'abc' str.match(reg) == ['abc', '']会多匹配一个逻辑上的空出来
如果reg = /\d*/ 那么看光标,几个光标几个空
n?      匹配任何0个或一个n的字符
n{X}    匹配X个n的序列字符串
n{X,Y}  匹配X至Y个n的序列字符串
n$      匹配以n结尾的字符串
^n      匹配任何以n开头的字符串
?=n     正向肯定预查匹配任何后面紧接着指定字符串n的字符串
?!n     正向否定预查匹配任何其后没有紧接着指定字符串n的字符串
?<=n    反向肯定预查匹配任何前面紧跟着指定字符串n的字符串
?<!n    反向否定预查匹配任何前面没有紧接着指定字符串n的字符串
非贪婪匹配:
n+?    n*? ...

补充

(?:n) 匹配时子表达式中没有这一项(不补获分组)

8.RegExp对象属性

global      查看RegExp对象是否具有g标志
ignoreCase  查看RegExp对象是否具有i标志
multiline   查看RegExp对象是否具有m标志
source      查看正则表达式源文本
lastIndex   一个整数标志开始下一次匹配的字符位置(一般与exec一起使用)

9.RegExp对象方法

compile    编译正则表达式。	(就是改变这个正则表达式)
exec(重要的方法)       检索字符串中指定的值。返回找到的值,并确定其位置。(如果属性不加g那么	lastIndex永远是第一位)	
test        检索字符串中指定的值。返回 true 或 false。	

10.字符串方法

search          检索正则表达式相匹配的值(返回匹配到的位置,中关心能不能匹配到,不关心能匹配多少个,所以加不加g都一样,匹配不到返回-1)
match           查找所有符合正则匹配条件的结果
replace(重要)        替换与正则表达式匹配的字符串(不写正则的时候只能替换一个,它没有访问全局的权利)
split           把字符串分割成数组(注: 用字表达式分割的话会保留子表达式)

11.相关面试题

  1. 正则表达式实现aabb的形式变成bbaa

    var str = 'aabbccdd';
    var reg = /(\w)\1(\w)\2/g;
     var str1 = str.replace(reg, function($, $1,$2) {
    return $2 + $2 + $1 + $1;
     })
     console.log(str1); //bbaaddcc
    
  2. 给10000000000三位打点 变成 10.000.000.000

     var str = '10000000000';
     var reg = /(?=(\B)(\d{3})+$)/g;
     str.replace(reg, '.'); //10.000.000.000
    
  3. 字符串去重 aaaaaaaaaaaaaaaaaaaaaabbbbbbbbcccccccccc变成abc

    var str = 'aaaaaaaaaaaaaaaaaaaaaabbbbbbbbcccccccccc';
    var reg = /(\w)\1*(\w)\2*(\w)\3*/g;
    str.replace(reg, function($, $1, $2, $3){
    return $1 + $2 + $3;
    }); //"abc"
    
  4. 把the-first-name转换成小驼峰式theFirstName

     var str = 'the-first-name';
     var reg =/-(\w)/g;
    str.replace(reg, function($, $1) {
    return $1.toUpperCase();
     }) //theFirstName
    
  5. 匹配结尾的数字

    //结尾是否为数字
     var str = 'dkfdj1232';
    var reg = /\d$/g;
    str.match(reg); //["2"]
    //首或者尾是否为数字
    reg = /'^\d|\d$'/g
    //首尾都为数字
    reg = /'^\d[\s\S]*\d$'/g
    
  6. 统一空格数

    var str = ' fkjdf ';
     var reg = /\s+/g;
     str.replace(reg, ' ');//" fkjdf "
    
  7. 判断字符串是不是由数字构成

     var str = 'fdjfd214234234';
    var reg = /(\d*?:[a-zA-Z])/g;
     reg.test(str);// false
    
  8. 删除字符串中的空格

    //删除前后空格
     var str = ' d kdfjd dfjdkf ';
     var reg = /(^\s*)|(\s*)$/g;
     str.replace(reg, '');//"d kdfjd dfjdkf"
    
    //删除所有空格
    var reg = /(\s*)/g;
    str.replace(reg, '');//"dkdfjddfjdkf"
    
  9. 身份证号匹配

    var str = '12345678976543879X';
     var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; //不需要全局匹配
     reg.test(str);
    
  10. 邮箱地址验证

    var str = '[email protected]';
    var reg = /^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_-]+)+$/;
    reg.test(str);
    

猜你喜欢

转载自blog.csdn.net/weixin_42418196/article/details/108445263