你不知道的正则表达式

609 阅读2分钟

正则表达式基本概念

简单的说,正则表达式是匹配模式,或者匹配字符,或者匹配位置;
一个正则表达式一般是由匹配的范围和匹配元素的次数所组成;

基本语法

  • 常用的范围表:
  • 常用的量词表:
  • 定位符表:
  • 特殊字符:(需要匹配下面字符时,需要转义即"\"+字符)
  • 非打印字符:

使用方式

  • 介绍

    • 判断string是否符合正则要求,返回 Boolean:regex.test(string);
    • 2)找出字符串中符合正则的字串,返回匹配结果的数组:regex.exrc(string);
    • 3)找出字符串中符合正则的字串,一次返回所有匹配结果的数组:string.match(regex);
    • 4)把原有的字符替换成新的字符:string.replace(regex,'替换的内容');
  • 举例

1)'test'
var str = "1a1b1c"; 
var reg = new RegExp("1.", ""); 
console.log(reg.test(str));  // => true

2)'exec'
var str = "1a1b1c"; 
var reg = new RegExp("1.", "g"); 
console.log(reg.exec(str));  
console.log(reg.exec(str));  
console.log(reg.exec(str));  
// =>
["1a", index: 0, input: "1a1b1c", groups: undefined]

["1b", index: 2, input: "1a1b1c", groups: undefined] 

["1c", index: 4, input: "1a1b1c", groups: undefined]

3)'match'
var str = "1a1b1c"; 
var reg = new RegExp("1.", "g"); 
console.log(str.match(reg));
// => ["1a", "1b", "1c"]

4)'replace'
var string="12345678"; //金额格式化,分位符
var result = string.replace(/(?!^)(?=(\d{3})+$)/g,',');
console.log(result); // => 12,345,678;

总结如下:

1. '{m,n}'与'{m,n}?'

a.'{m,n}'
var regex = /\d{2,5}/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) );// => ["123", "1234", "12345", "12345"]

b.'{m,n}?'
var regex = /\d{2,5}?/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) );// => ["12", "12", "34", "12", "34", "12", "34", "56"]

c.总结:
'{m,n}'是指匹配元素至少出现m次,最多出现n次;
在'{m,n}'没有加'?'代表匹配为贪婪,尽可能多的匹配;如果没有加'?'代表匹配为惰性,即匹配m次就够了,不需要匹配n次了。

2. '[ab]'与'[a|b]'

a.'[ab]'
var regex = /\d[ab]/g;
var string = "123a 1234ab 12345abc 123456ac";
console.log( string.match(regex) );// => ["3a", "4a", "5a", "6a"]

b.'[a|b]'
var regex = /\d[a|b]/g;
var string = "123a 1234ab 12345abc 123456ac";
console.log( string.match(regex) );// => ["3a", "4a", "5a", "6a"]

c.总结:
'[ab]''[a|b]'都是匹配一个元素;

3. '^'(匹配开头)和'^'(取反)

a.'^'(匹配开头)
var regex=/^\d/g;
var string_a="1abc";
var string_b="bac";
console.log(regex.test(string_a)); // => true;
console.log(regex.test(string_b)); // => false;

b.'^'(取反)
var regex=/\d[^a]/g;
var string_a="1abc";
var string_b="1bac";
console.log(regex.test(string_a)); // => false;
console.log(regex.test(string_b)); // => true;

c.总结:
如何区别'^'?一般跟在'/'后面的,就是匹配开头;一般跟在'['后面的,就是取反;

4. '\b'和'\B'

a.'\b'(单词边界)
var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#');
console.log(result);
// => "[#JS#] #Lesson_01#.#mp4#"

b.'\B'(非单词边界)
var result = "[JS] Lesson_01.mp4".replace(/\B/g, '#');
console.log(result);
// => "#[J#S]# L#e#s#s#o#n#_#0#1.m#p#4"

c.总结:
'\b':具体就是 \w 与 \W 之间的位置,也包括 \w 与 ^ 之间的位置,和 \w 与 $ 之间的位置。(\w=[0-9a-zA-Z_]);简单说匹配由数组,字母和下划线组成的单词

5. '(?=e)'和'(?!e)'

a.'(?=e)'(匹配e前面的位置)
var result = "hello".replace(/(?=e)/g, '#');
console.log(result);
// => "h#ello"

b.'(?!e)'(匹配不是e前面的位置)
var result = "hello".replace(/(?!e)/g, '#');
console.log(result);
// => "#he#l#l#o#"

举例说明:

1. 判断是否包含有某一种字符

场景:通常在验证表单密码,要求密码包含数字,小写字母和大写字母组成;


第一步:匹配数字
var regex_1=/(?=\d)/g;
var string_1="abc123456";
console.log(regex_1.test(string_1)) // => true;

第二步:匹配小写字母
var regex_2=/(?=[a-z])/g;
var string_2="abc123456";
console.log(regex_2.test(string_2)) // => true;

第三步:匹配大写字母
var regex_3=/(?=[A-Z])/g;
var string_3="Abc123456";
console.log(regex_3.test(string_3)) // => true;

第四步:匹配包含
var regex = /(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])^[0-9A-Za-z]{6,12}$/;
var string="Abc123456";
console.log(regex.test(string)) // => true;

2. 金额的分位符格式化

场景:通常金额的分位符;
思路:从最后一位往前算,每逢第3位,加‘,’;

var string="12345678";
var result = string.replace(/(?!^)(?=(\d{3})+$)/g,',');
console.log(result); // => 12,345,678;

3. 获取当前url查询字符串中的参数的方法

场景:提取数据
思路:用“&”为分割标志,然后再利用字符串分割“=”

function urlFun(url){
    var addUrl=url+"&"
    var reg=/[\?|&].+?(?=&)/g
    var narr={};
    addUrl.match(reg).forEach((item) => { 
        var str=item.slice(1);
        narr[str.substring(0,str.indexOf('='))]=str.slice(str.indexOf('=')+1);
    });
    console.log(narr);
}
urlFun("https://baidu.com/index?page=38&q=is%3Aissue+is%3Aopen");

>{page: "38", q: "is%3Aissue+is%3Aopen"}

结尾

正则表达式学习笔记会不断更新,请期待!
如果文章中有误的,可以留言告知。希望这篇文章对你有帮助!一起成长!一起进步!