正则表达式

正则表达式

  1. 字面量写法

    语法:

    var patt=/pattern/modifiers;

    • 模式(pattern)描述了一个表达式模型。
    • 修饰符(modifiers)描述了检索是否是全局,区分大小写等。
    例子:
    var str = 'mjj'
    var p = /mjj/g
    var result = p.test(str)
    console.log(result)
    
  2. 构造函数写法

    语法:

    // RegExp regular expression
    var patt=new RegExp(pattern,modifiers);

    例子:
    var str1 = 'mjj'
    var p1 = new RegExp('mjj','g')
    var result1 = p1.test(str)
    console.log(result1) // true
    
元字符

以下操作可以通过 https://regexr.com/ 网站进行操作,可以验证匹配

.匹配任意字符

var str2 = 'hello world'
var p2 = /./g;
var result2 = p2.test(str2)
console.log(result2) // true

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sr1HxSpE-1619344716479)(…/pic/regexp/regexp1.png)]

^匹配字符串开始的位置

$匹配字符串结束的位置

\w 匹配数字和字母下划线 [A-Za-z0-9_]

\W 匹配非数字和非字母 [^A-Za-z0-9_]

\d 匹配数字

\D 匹配非数字

\s 空白字符

\S 非空白字符

[]字符集合

 /[\u4e00-u9fa5]/g   //中文

[^] 集合内的^代表取反

+ 匹配重复一次或者多次 runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)

* 匹配重复0次或者多次 runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)

? 匹配重复0次或者1次 colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)

{} 重复次数 {2} {1,7}

() 分组匹配捕获

| 或者

RegExp.$1 捕获匹配

?: 分配不捕获 (?:http|https)

正向预查 (?=) 正向否定预查(?!) (?!=元|\d)

200元 2000元 200刀 200磅

反向预查 (?<=¥) (?<!¥|\d)

字符串方法

test()

返回一个布尔值,表达当前模式能否匹配 。到 true 不匹配 false

exec()

match()

var str="The rain in SPAIN stays mainly in the plain"; 
var n=str.match(/ain/g);

匹配到返回一个匹配数组,没有匹配到null

search()

匹配到返回索引,没有匹配 返回-1

replace()

var s = "2020.12.01"
console.log(s.replace(/\./,'-'))
//2020-12.01
console.log(s.replace(/\./g,'-'))
//2020-12-01
练习
  1. 检查用户账号

    //用户名: 字母、数字、下划线组成,以字母开头 4-16位
    function checkUserName(str) { 
      let rule = /^[a-zA-Z]\w{3,15}$/g
      return rule.test(str)
    }
    var str = 'a123_ksdf'
    console.log("result:")
    console.log(checkUserName(str))
    
  2. 匹配手机号

    // 11位  以1开头   3  5  7  8  
    function checkPhone(str) {
    
      let rule = /^1[3|5|7|8]\d{9}$/g
      return rule.test(str)
    
    }
    var  str = '1366626195'
    console.log("result:")
    console.log(checkPhone(str))
    
  3. 匹配电话号码

    // 验证规则:区号 + 号码
    function checkPhone(str) {
    
      let rule = /^0\d{2,3}-?\d{7,8}$/g
      return rule.test(str)
    
    }
    var  str1 = '010-88888888'
    var  str2 = '0532-6767676'
    var  str3 = '01088888888'
    console.log("result:")
    console.log(checkPhone(str1))
    console.log(checkPhone(str2))
    console.log(checkPhone(str3))
    
  4. 匹配身份证

    // 15 位 全是数字  18位 前17位是数字最后一位数字或者字符x X
    function checkCard(str) {
    
      let rule = /^\d{15}$|^\d{17}(\d|x|X)$/g
      return rule.test(str)
    
    }
    var  str1 = '1234567891234555'
    var  str2 = '0532-6767676'
    var  str3 = '01088888888'
    console.log("result:")
    console.log(checkCard(str1))
    console.log(checkCard(str2))
    console.log(checkCard(str3))
    
  5. 匹配邮箱

    
    
  6. 判断字符串是否是这样组成的:第一个必须是字母,后面可以是字母、数字、下划线,总长度为5-20。如果符合条件返回1,否则返回0。

    function checkString(str){
        let rule = /^[a-zA-Z]\w{4,19}$/g
        return rule.test(str)?1:0
    
      }
    
  7. 提取区号

    var sss = "我的银行账号是xxxxx,我的电话号码是0731-888888,将这段文本中的区号提取出来"
    sss.match(/(\d{4})-/g)
    console.log(RegExp.$1)
    
  8. 判断一个五位数字是否是回文数

  9. 给一个连字符串例如:get-element-by-id转化成驼峰形式

    function convertValue(params) {
      return params.replace(/-([a-z])/g,(match,$1)=>{
      	return $1.toUpperCase()
      })
    }
    
    var strValue = "get-element-by-id"
    
    console.log(convertValue(strValue))
    
  10. 给一个连字符串例如:getElementById转成连接符形式get-element-by-id

    function convertValue(params) {
      return params.replace(/[A-Z]/g,(match)=>{
        return '-'+ match.toLowerCase()
      })
    }
    
    var strValue = "getElementById"
    
    console.log(convertValue(strValue))
    
  11. 匹配二进制数字

    var str = "10101010";
    var reg = /^[01]+$/g;
    console.log(reg.test(str));
    
  12. 非零的十进制数字 (有至少一位数字, 但是不能以0开头)

    var str = "81";
    var reg = /^[1-9][0-9]*$/g;
    console.log(reg.test(str));
    
  13. 匹配一年中的12个月

    var str = "12";
    var reg = /^(0?[1-9]|1[0-2])$/g;
    console.log(reg.test(str));
    
  14. 分割数字每三个以一个逗号划分

    var str = "12345678901";
    function numSplit(str){
        var re = /(\d)(?=(\d{3})+$)/g;
        //(\d{3})+$ 的意思是连续匹配 3 个数字,且最后一次匹配以 3 个数字结尾。
        //要找到所有的单个字符,这些字符的后面跟随的字符的个数必须是3的倍数,并在符合条件的单个字符后面添加,
        return str.replace(re,'$1,');
    }
    console.log(numSplit(str));
    
  15. 匹配用尖括号括起来的以a开头的字符串

    var str = "<a herf='www.baidu.com'>";
    var reg = /<a[^>]+>/g;
    console.log(str.match(reg));
    
  16. 匹配ip地址

    var str = "255.221.221.12";
    // [01]?\d\d?表示匹配小于199的数,可以说两位数或一位数,2[0-4]\d表示从200到249,配合25[0-5]就表示小于255的数了。
    var reg = /(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|2[0-4]\d|25[0-5])$/g;
    console.log(str.match(reg));
    
面试题解析:
  1. 模板字符串填充
    var str = '我是一名{0},我来自{1},我的爱好是{2}'
    
    var info = ['前端开发工程师', '中国', '旅行']
    
    var newStr = str.replace(/{([0-9])}/g, function (all, val) {
    
        return info[val]
    
    });
    
参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值