JS正则表达式

1,048 阅读4分钟

1.转义符号

首先铺垫知识,转义符号是什么

比如你想在一个字符串里面整一个引号,你肯定不能写" asd"asd"(脑溢血写法)

这个时候你就得用到转义符号“\”了 ————> “asd"asd”

2.配合字母

简单举几个例子

  • \n 换行
  • \r 行结束
  • \t tab健
  • 一个回车代表的就是\r\n

3.正则表达式

RegExp();

1.首先基础格式是这样的

var reg = /    /;
里面写的就是表达式
举个例子
var reg = /abc/;
var str = "abcd";
reg.test(str);  //判断str里面是否有abc 有则true,否则false

基础格式后面可以添加i,g,m
作用分别是
var reg = /    /i; 忽略大小写
var reg = /    /g; 全局匹配
var reg = /    /m; 多行匹配

其中i,g好理解,m的意思就是分行匹配,比如
var reg = /^a/m; //以a开头的行的那个a
var str = "abcd\na";
str.match(reg);
输出的就是["a","a"];

还有一种表达的方式,用的不多了解一下

var reg = new RegExp("","");

第一个参数就是abc啊之类的,第二个参数就是i,g,m

既然有对象那就要看一下指向问题

var reg1 = /abcd/;
var reg2 = new RegExp(reg1);
这时候reg1和reg2是一样的,但不是同一个
改变reg1中的属性reg2中的不会变
但是如果去掉 new 关键字,俩就是一样的,经典两把钥匙一扇门

4.表达式

var reg = / [ ] /g;
这里面[]代表的就是一位。
要求找三个连着的数字,那就是
var reg = /[1234567890][1234567890][1234567890]/g;
当然也可以写[0-9],写\d

注意一点就是 ^ 写在外面是以什么开头,而写在 [ ] 里面的意思是 “非”。

[^a]意思就是除了a以外的所有

5.元字符

\w === [0-9A-z_]  所有字母数字以及下划线(有些网站取名字好像就是这个标准呢)

\W === [^\w] 爹和儿子互补

\d ===[0-9]

\D === [^d]

\s === 空白字符(空格符、制表符、回车符、换行符、垂直换行符、换页符)

\S === 非空白字符

\b === 单词边界

var str = "i am handsome and smart";

这里面的单词边界就是(我用 . 代替).i..am..handsome..and..smart.

也比较好理解

\B === 非单词边界

6.量词

比如说你想匹配3位数的数字

就可以

var reg = /\d{3}/g;
var str = "123567908";
console.log(str.match(reg)); //["343", "465", "435"]

一些符号代表的含义

n+   ————>{1, }   1到正无穷

n*    ————>{0, }   0到正无穷

注意下面这种情况

var reg = /\w*/g;
var str = "abc";
str...
输出的是["abc",""]

因为匹配到最后一位,到匹配完还有一位逻辑距离,此时*取0可以匹配出一个""。

var reg = /\d*/g;
var str = "abc";
str...
输出的是["","","",""]

注意正则表达式里面是贪婪匹配,能多不少

取下贪婪匹配的方法就是在量词后面加 ?

比如你是reg = /\d{3,5}/g;

能匹配5个绝对不匹配3个

实在没5个了才匹配三个

——————————————————————

/^       / 以什么开头

/       $/ 以什么结尾

/^abc$/ 就指定了必须是这个abc,定死了。

例题:检验一个字符串首尾是否含有数字

var reg = /^\d|\d$/g;
var str = "123abc123";
reg.test(str);

检验一个字符串首尾是否含有数字

var reg = /^\d[\s\S]*\d$/g;
var str = "123abc123";
reg.test(str);

7.反向引用

比如要你选出aabb这种形式的字符串咋办

这个时候就可以用反向引用的知识

var reg = /(\w)\1(\w)\2/g;
             a  a  b  b
这里面的\1意思是反向引用这里面的第一个子表达式,\2就是反向引用第二个
这里就又可以穿插一下exec这个东西了
还是这个题
var str = "aabb";
var reg = /(\w)\1(\w)\2/g;
console.log(reg.exec(str));
输出结果会是:

很明显\1就是这里面的"a",\2就是"b"

其实exec有蛮大的学问

里面有个lastIndex参数,是exec匹配的游标,而且我们可以手动修改

var reg = /ab/g;
var str = "abababab";
reg.exec(str);
输出只输出一个["ab"]
继续执行他会输出4次ab,到第5次会输出null
然后开始循环

所以他其实每次执行的匹配游标不一样,上面是lastIndex数值

8.replace

一个很实用的方法,看名字就知道是什么作用

直接上题:将aabb替换为bbaa

var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
str.replace(reg,"$2$2$1$1");
这里的$1就相当于reg里的\1
注意replace没有访问全局的能力,如果reg里面没有g,就只替换一个。

9.正向断言

正向预查,正向断言
var str = "abaaaa"; //我们只想要后面跟着b的a
var reg = /a(?=b)/g;
 var reg = /a(?!b)/g; //不跟着b的a

题目

正则表达式的题目很多,我也就不做总结了,选一个自己觉得很搞的

给一个数100000000000,你要把它写成10,000,000,000这种形式

开始不做人,一行搞定

var str ="100000000000";
var reg = /(?=(\B)(\d{3})+$)/g;
//从后往前查,3个数的倍数位前面的空,且不能为数字边界的空
console.log(str.replace(reg,","));