美文网首页
JS正则表达式从入门到够用

JS正则表达式从入门到够用

作者: 踩坑怪At芬达 | 来源:发表于2019-10-29 22:43 被阅读0次

如果觉得还有点用,请您给我一个赞!您的赞是我坚持下去的动力

设想我们是否遇到这些问题?

  • 一个url的参数列表
    var str= "?am_id=2&approach=test&type=2&phone=137000";

    • 取出type的值?
    • 替换type的值?
    • 直接删除type这个参数
    • 取出所有符合规则 参数=值 的内容
  • 一个替换字符串的案例
    var str = "{param1} name is {param2}";

    • 将{param1}替换为my,将{param2}替换为changxu ,结果变为了 my name is changxu
    • 将符合规则“{参数名}”格式的字符串,整个替换掉,替换的目标字符串根据"参数名"。
js中正则的使用
  • /正则表达式/.test("字符串");
  • var patt = new RegExp("正则表达式","扩展参数");
    patt.test("字符串")

Step1:常用符号

  • 用于代表位置的
字符 含义
^ 字符串开始位置,也就是第一个字符位置
$ 字符串结尾位置,也就是最后一个字符位置
  • 用于检测匹配的表达式次数,可以称为量词
字符 含义
* 匹配这个符号之前的表达式,任意次数
+ 匹配这个符号之前的表达式,至少1次
? 匹配这个符号之前的表达式,至少0次或者1次,如果?之前的是一个量词描述则代表非贪婪模式尽可能匹配少 '123456'.replace(/\d{2,4}/g,'*')结果为**,而'123456'.replace(/\d{2,4}?/g,'*')结果为***
{n} 匹配这个符号之前的表达式,n次
{n,} 匹配这个符号之前的表达式,至少n次
{n,m} 匹配这个符号之前的表达式,>=n && <=m 次之间
  • 组成表达式需要的参数
字符 含义
. 匹配 \r\n 外的任意字符
x|y 匹配x或者y任意一个,x和y可以是字符也可以是表达式
[xyz] 匹配括号内的任意一个字符
[^xyz] 匹配除了括号内的字符外的字符
[a-z] 匹配a-z之间的任意一个字符
[a-zA-Z] 匹配a-z或A-Z之间的任意一个字符
[0-9] 匹配0-9之间任意一个字符,等价于\d
  • 特殊作用
字符 含义
( ) 将()范围内符合表达式的结果输出到数组内,最多可以存放9组[0]-[9]
(?:表达式)) 不会缓存括号内的数据
(?=表达式)) 符合匹配的字符串位置之前(并且不会缓存括号内的数据)
(?!表达式)) 不匹配表达式的内容

(?:)和(?=)的区别

  • (?:)符合匹配的字符串位置,(?:\d)和\d除了不缓存数据外没其他差别
  • (?=)符合匹配的字符串位置之前
'12345678'.replace(/(?:\d)/g, ','); 在这里等同于 '12345678'.replace(/\d/g,',');
    结果:",,,,,,,,"
'12345678'.replace(/(?=\d)/g, ',');
    结果",1,2,3,4,5,6,7,8"

Step2实战开始:在字符串中查找出所有匹配规则的字符串

    var str = "changxu is chang + xu , changxu is a boy";
    var patten = /changxu/; //寻找出所有的changxu来
    var result = patten.exec(str);
    console.log(result);
    console.log(patten.lastIndex);

    打印结果:
    ["changxu", index: 0, input: "changxu is chang + xu , changxu is a boy"]
    0
    
    总结:
    * 只找出了一次,但是我们想要找出所有的,怎么办?
    * result为一个array结构,可以通过result.length 查询长度。result[0]存放搜索结果,1~9存放了我们表达式内匹配()的部分
    * result.input:为当前执行搜索的字符串原型,由于基本没啥用处,所以下面的案例里面我省略了这个参数
    * result.index:代表当前关键字出现的第一个位置

遗留问题:这里只查到了字符串中第一个changxu,如何查到所有的?

利用g参数来循环查找我们需要的字符止到结尾

    var str = "changxu is chang + xu , changxu is a boy";
    var patten = /changxu/g; //寻找出所有的changxu来
    var result = patten.exec(str);
    while( patten.lastIndex != 0  ){//当增加了g参数,patten.lastIndex才会起效,不然永远是0
        result = patten.exec(str);
        console.log(result);
        console.log(patten.lastIndex);
    }
    结果:
    ["changxu", index: 0]
    7
    ["changxu", index: 24]
    31
    0

既然找到了目标,那么我们将所有的changxu替换为god

    var str = "changxu is chang + xu , changxu is a boy";
    var patten = /changxu/g; //如果没g的情况下,只会替换一次
    var result = str.replace(patten,"god");
    console.log(result);
    console.log(patten.lastIndex);
    结果:
    god is chang + xu , god is a boy
    0

我们以changxu为目标,切割字符串

    var str = "changxu is chang + xu , changxu is a boy";
    var patten = /changxu/; // 这里有g和无g没区别
    var result = str.split(patten);
    console.log(result);
    console.log(patten.lastIndex);
    结果:
    ["", " is chang + xu , ", " is a boy"]
    0

( ) 的用法

举个例子:我们搜索一个字符串内所有符合在{}之间的字符串,并且需要把中间的内容取出来

    var str = "{i love you},{i need you},{you love me},you need me";
    var patten = /{i (\w+) you}/g; 
    var result = patten.exec(str);
    console.log(result);
    console.log(patten.lastIndex);
    while( patten.lastIndex != 0  ){
    result = patten.exec(str);
    if( result ) console.log(result);
    console.log(patten.lastIndex);
    }
    结果:
    ["{i love you}", "love", index: 0]
    12
    ["{i need you}", "need", index: 13]
    25
    0

那么现在如何将这些找出来的字符替换成我们想要的呢?

还是这个例子,我们{ i @key you} 里面的这个@key找出来了,那么将@key全部替换为“fuck”怎么做呢?

    var str = "{i love you},{i need you},{you love me},you need me";
    var patten = /{i (\w+) you}/g; 
    var result = str.replace( patten, function(allKey,key1){//如果有多个key那么这里可以增加key2,key3,key4....
          console.log(allKey+'\t'+key1);
        allKey = allKey.replace(key1,"fuck");
        return allKey;
    } );

    console.log(result);
    结果:
    {i love you} love
    {i need you} need
    {i fuck you},{i fuck you},{you love me},you need me

i参数忽略大小写

var patten = /{i (\w+) you}/ig; 

回到最初

  • 取出所有 参数=值 列表
var str= "?am_id=2&approach=test&type=2&phone=137000";
var result = {};
var temp = null;
var patten = /([^&?]+)=([^&?]+)/g;
temp = patten.exec(str);
if (temp) {result[temp[1]] = temp[2];}
while (patten.lastIndex !== 0) {
    temp = patten.exec(str);
    if (temp) {result[temp[1]] = temp[2];}
}
console.log(result);
  • 查询type的值?
var temp = null;
var patten=/[&?]type=([^&?]+)/g;
temp = patten.exec(str);
if(temp){console.log(temp[1]);}

排除字符串

假设我们要排除字符串中不能有antd字符串,我们可以用
/^((?!字符串).)+$/,这里要注意必须带上^开头符和$结尾符,想想为什么?

/^((?!antd).)+$/

这个正则图形化后的逻辑如下图


image.png

match和exec的区别

使用方法不一样

    * match是字符串包装对象的方法,用法:String.match(RegExp);
    * exec是正则表达式对象的方法,用法:RegExp.exec(String);
    * match将会把所有查询到匹配的字符串给放进数组内输出,而exec则需要循环调用来达到获取所有的匹配

常用正则

  • 将手机号以 xxx xxxx xxxx格式化
var phone='13766778899';
phone = phone.replace(/(\d)(?=(\d{4})+$)/g, '$1 ');
  • 将数字按货币方式以逗号分割 如:1,234,567,890,123
    var money='1234567890123';
    money.replace(/(\d)(?=(\d{3})+)/g, '1,');

  • 新的货币切割方式
    console.log(new Intl.NumberFormat().format(123456.3334));

案例对比

var patten = /(\d\d(?:\d\d))/g;
var str = "12345678";

var result = patten.exec(str);
console.log(result);
while(result&&result.index>=0){
    result = patten.exec(str);
    console.log(result);
}
["1234", index: 0, input: "12345678"]
["5678", index: 4, input: "12345678"]



var patten = /(\d\d(?=\d\d)/g;
var str = "12345678";
var result = patten.exec(str);
console.log(result);
while(result&&result.index>=0){
    result = patten.exec(str);
    console.log(result);
}

["12", index: 0, input: "12345678"]
["34", index: 2, input: "12345678"]
["56", index: 4, input: "12345678"]


相关文章引用及推荐

相关文章

  • JS正则表达式从入门到够用

    如果觉得还有点用,请您给我一个赞!您的赞是我坚持下去的动力 设想我们是否遇到这些问题? 一个url的参数列表var...

  • 01vue-安装vue

    资源 1.Vue.js2.0从入门到放弃---入门实例(一)2.Vue.js入门学习(一)3.Vue官方中文Api...

  • Blue教程汇总

    【JavaScript从入门到精通】第二十四课 JS面向对象基础-01 【JavaScript从入门到精通】第二十...

  • 正则表达式

    javascript正则表达式正则表达式30分钟入门教程js的正则表达式的正则前瞻(?=)和非捕获性分组(?:)有...

  • Fabric.js 画布基础功能

    原文出处:Fabric.js 从入门到________[https://juejin.cn/post/702694...

  • sed 编辑器从入门到够用

    sed 是在命令行环境使用的编辑器,它可以不依赖交互界面来完成一些文本的编辑操作,适合在自动化脚本中用来修改配置文...

  • JS Promise 从入门到实践

    如果我们不是把头埋在沙子里,而是准备好应对之道的话,未来会美好得多。 ES6 新增的promise,能让你书写简单...

  • JS 原型从入门到实践

    很多看起来简单的事情,坚持做到极致就有非凡的力量。 我们可以在原型对象上增加特定属性,原型是定义属性和功能的一种便...

  • JS正则表达式

    JS正则表达式一条龙讲解,从原理和语法到JS正则、ES6正则扩展,最后再到正则实践思路 Stinson 关注 20...

  • 正则详解--程序员必备

    转自: JS正则表达式一条龙讲解,从原理和语法到JS正则、ES6正则扩展,最后再到正则实践思路 温馨提示:文章很长...

网友评论

      本文标题:JS正则表达式从入门到够用

      本文链接:https://www.haomeiwen.com/subject/dwrnvctx.html