正则表达式

201 阅读4分钟

正则表达式的作用:匹配特殊字符或有特殊搭配原则的字符

【工具】可视化正则表达式

基础认识

创建方法

  1. var reg = /abc/i;
  2. var reg = new RegExp("abc","i");

两个方法

reg.test();               //判断字符串上是否有符合要求的字符,返回truefalse
str.match();              //把符合要求的字符串匹配出来并返回

修饰符

  1. i --> 忽视大小写
var reg = /abc/i
var str = "ABC"           //true 
  1. g --> 全局匹配(不在找到第一个匹配后停止)
var reg = /ab/g
var str = "abababab"
str.match(reg)            //["ab","ab","ab","ab"]
  1. m --> 多行匹配
var reg = /^a/g           //^a 表示匹配以a开头的a
var str = "adcdba"        //现在只匹配一个
var str = "adcbd\na"      //仍然只匹配一个
                          //reg = /^a/gm 加上m后可以多行匹配,才能匹配出两个a

匹配规则

方括号

一个方括号是一位,方括号里面的内容是这一位可以取的范围。

[0-9A-z] 匹配 0 ~ 9,A ~ Z,a ~ z

[^a] 非a

(abc|bcd) 匹配abc或bcd

元字符

拥有特殊含义的字符

元字符描述===
.查找单个字符,除了换行和行结束符[^\r\n]
\w查找单词字符[0-9A-z_]
\W查找非单词字符[^\w]
\d查找数字字符[0-9]
\D查找非数字字符[^\d]
\s查找空白字符[\n\f\r\t\v ]
\s查找非空白字符[^\s]
\b匹配单词边界
\B匹配非单词边界
\0查找NUL字符
\n查找换行符
\f查找换页符
\r查找回车符
\t查找制表符
\v查找垂直制表符

量词

n+ 【1,】 n*【0,】n?【0,1】

var reg = /\w+/g;
var str = "abcd";
str.match(reg);               //["abcd"]
var reg = /\w*/g;
var str = "abcd";
str.match(reg);               //["abcd",""]

n{X}【x】n{X,Y}【x, y】n{X, }【x, 】

正则表达式有一个贪婪匹配原则,即每次都匹配可以匹配的最多的数量,在表达式后加 "?" 可以把它变成不贪婪的(匹配少不匹配多)。

开头,结尾

^n n$

var reg1 = /^abc/g;
var reg2 = /ef$/g;
var str = "abcdef";
reg1.test(reg1);              //true 可匹配以a开头+"bc"
reg2.test(reg2);              //true 可匹配"e" + 以f结尾 

紧跟,不紧跟

?=n ?!n

var str = "abaaa"
var reg = /a(?=b)/g           //可匹配后面紧跟ba

RegExp对象方法

test

检索字符串中指定的值。返回true或false

exec

检索字符串中指定的值。返回找到的值,并确定其位置。

RegExp有一个lastindex属性,它和此方法中的index是一样的(可以理解为这次匹配时游标从哪里开始匹配)。

而且我们可以修改lastindex的值,修改后执行exec方法,它的index值会跟随我们的修改。所以lastindex和exec方法是相配合的。

当然如果没有global属性的话,它每次执行都是从0开始匹配的,游标不会动。

var reg = /ab/g;
var str = "ababab";
console.log(reg.exec(str));       //["ab",index:0,input:"abababab"]
console.log(reg.exec(str));       //["ab",index:2,input:"abababab"]
console.log(reg.exec(str));       //["ab",index:4,input:"abababab"]
console.log(reg.exec(str));       //null
console.log(reg.exec(str));       //["ab",index:0,input:"abababab"]

如果使用\w+匹配,可以匹配出【1-infinite】个满足\w的字符。若想要匹配“XXXXX”形式(像aaaaa或bbbbb)的字符串怎么匹配呢?

var reg = /(\w)\1/g;              //\1是反向引用第一个子表达式的内容,此时如果
                                    想匹配三个a,可以这样---->"/(\w)\1\1/"
var str = "aaaaa";

//还可以匹配aabb式的字符串
var reg = /(\w)\1(\w)\2/g;
var str = "aabb"

在上面的情况下使用exec方法,会发现结果和之前的会有些不一样。(第一个子表达式和第二个子表达式的内容也会在返回的类数组中)

console.log(reg.exec(str));       //["aabb","a","b",index:0,input:"aabb"]

支持正则表达式的string对象方法

split

把字符串分割成字符串数组

search

检索与正则表达式相匹配的值

返回的只要不是-1就是匹配成功。返回的是成功匹配的位置。

match

找到一个或多个正则表达式的匹配

加g和不加g的结果区别

var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
console.log(str.match(reg));       //["aabb","a","b",index:0,input:"aabb"]

var reg = /(\w)\1(\w)\2/;
var str = "aabb";
console.log(str.match(reg));       //["aabb"]

replace

替换与正则表达式匹配的子串

var str = "aa";
console.log(str.replace("a","b"));        //"ba"
var reg = /a/g;
var str = "aa";
console.log(str.replace(reg,"b"));        //"bb"

把aabb式字符串的全替换成bbaa

var reg = /(\w)\1(\w)\2/;
var str = "aabb";
console.log(str.replace(reg,"$2$2$1$1"));    //子表达式在这儿可以通过$引用到

//另一种方式
console.log(str.replace(reg,function($, $1, $2){
    return $2 + $2 + $1 + $1
}));

【有意思的题】

  1. ----> the-first-name 经过处理后变成小驼峰式 theFirstName
var str ="the-first-name";
var reg = /-(\w)/g;
console.log(str.replace(reg,function($,$1){
    return $1.toUpperCase();
}))
  1. ---->转科学计数法 100000000 <--> 100.000.000

查找""然后替换成".",替换时注意要是非单词边界才能替换,不然可能会出现".100"

var str = "100000000";
var reg = /(?=(\B)(\d{3})+$)/g;
console.log(str.replace(reg,"."));