10-正则表达式

字面量

// 默认单个匹配模式
let str="asf6767asdfasd787asf787fad777"
let reg=/\d+/
let res=str.match(reg)
//res ["6767", index: 3, input: "asf6767asdfasd787asf787fad777", groups: undefined]

// g:全局匹配模式
let str="asf6767asdfasd787asf787fad777"
let reg=/\d+/g
let res=str.match(reg)
//res (4) ["6767", "787", "787", "777"]

//构造函数创建
let str="asf6767asdfasd787asf787fad777"

let reg=RegExp('\\d+','g')  //构造函数创建正则

let  a="\\d+"  //构造函数的正则,\d\s...需要➕\
let reg=RegExp(a,'g') //构造函数引入变量作为正则表达式,匹配模式g

let res=str.match(reg) //["6767", "787", "787", "777"]

正则方法 (正则式.test())

  • test
let str="ae3"
let reg=/\d+/ // +:1,多
let res=reg.test(str)
//res true 有没有g都一样,找到一个就完事
  • exec
//匹配单个
let str="ae33ff22"
let reg=/\d+/ 
let res=reg.exec(str) //匹配单个,执行多次每次都是从头找
// res ["33", index: 2, input: "ae33ff22", groups: undefined]

//全局匹配
let str="ae33ff22"
let reg=/\d+/g // +:1,多
let res=reg.exec(str) //全局匹配,执行多次每次都是接着上次的找
// res ["33", index: 2, input: "ae33ff22", groups: undefined]

字符串方法(也可以用正则)

  • split 截取
  • replace 替换
  • search 搜索
  • match 匹配
// split 截取
let str="aaadddaafff345";
console.log(str.split('a')) //["", "", "", "ddd", "", "fff345"]

// replace 替换
let str="中国人口大教育部哈哈哈教育部"
let reg=/教育部|中国/g
let res=str.replace(reg,function(arg){ 
    console.log(arg) //符合正则的字符串
    return '*'.repeat(arg.length) // '*'.repeat(n)重复字符串n次
})

// search 搜索
// 查找第一个符合结果的索引位置;找不到返回-1;忽略全局匹配
let str='fafafafdfsag899'
let reg=/\d+/;
let res=str.search(reg);
console.log(res)//12

// match 匹配
let str="fafa33fafdfsag899"
let reg=/\d+/; //匹配单个 match详细
let res=str.match(reg)
console.log(res) // ["33", index: 4, input: "fafa33fafdfsag899", groups: undefined]

let str="fafa33fafdfsag899"
let reg=/\d+/g; //匹配全局 match返回数组
let res=str.match(reg)
console.log(res) // ["33", "899"]

元字符:正则中有特殊含义的非字母字符

  • .
  • *+?
  • ^ $
  • | \
  • () [] {}
// . => 匹配除了 \n \r \u2028段落结束符 \u2029行结束符之外的字符

//有回车符
let str=`<div>somed  
dss99..</div>`
//表达式里有/结尾符 需要用转义字符 "\"转义:将特殊含义转换成字面量含义;
let reg=/<div>.*<\/div>/g; 
let res1=reg.test(str)
console.log(res1) //false


// * => 0,多 有或无,有就多
// + => 1,多 至少有一个
// ? => 0,1 有或无,有且只有1个
// ?+是对?进行1次或多次,引起误解


//不是全局匹配的话 执行多次也是匹配1次然后重新开始
//全局匹配:找到1个符合条件的,记住最后一个索引,接着找
// ^:开头 $:结尾 \w:数字 字母 下划线
let str='cfdsaf3lcrrrlcgsl'
let reg=/^c\w+l$/g //c开头 l结尾 中间至少数字/字母/下划线
let res=reg.test(str) //true
let res1=reg.test(str) //false 只能找到一个???


// []:“字符集合-或” /[ab]/ <=> /a|b/
// [^]^在[]里时,当非讲,即除了[]里面字符串之外的
let str="abcd1234abcdcsd"
let reg=/c|d/g
let reg1=/[cd]/g //c|d
let reg2=/[^cd]/g // 除了c d
let a=str.replace(reg,'*')  // "ab**1234ab***s*"
let b=str.replace(reg1,'*') // "ab**1234ab***s*"
let v=str.replace(reg2,'*') // "**cd******cdc*d"


// [0-9]:0-9
// [0-20]: 0-2|0  
let str="03ppp2ppp43pp02p0pp"
let reg=/\d+/g //至少一个的数字,连续匹配
let reg1=/[0-9]+/g //等价于上面
let reg2=/[0-20]+/g //0-2|0 1个字母1个字母的匹配
str.match(reg)  // ["03", "2", "43", "02", "0"]
str.match(reg1) // ["03", "2", "43", "02", "0"]
str.match(reg2) // ["0", "2", "02", "0"]


// ?
let str="this fff is 6kkm"
let reg=/[KkCc]?[mM]/ 
let res=str.replace(reg,'米') // this fff is 6k米
// 第一个k后面没有m|M,没匹配上
// km匹配上了,换成了‘米’

// . <=> [^\r\n\u2028\u2029]
// \d <=> [0-9]
// \w <=> [a-zA-Z_0-9] 数字 字母 下划线
// ? <=> {0,1} 0|1
// + <=> {1,} 至少一次,无上限
// * <=> {0,} 0,多
// {3} 重复3次
// {} => 重复次数


let str="this fff /is 6m"
let reg=/\bis\b/g //边界 id 边界
let res=str.match(reg) //[is]

let str="this fff /is 6m"
let reg=RegExp('\\bis\\b','g')  //构造函数里的正则,\要用\转义一下
let res=str.match(reg) //[is]

//{3} 重复次数
let reg1=/s{3}/g; //s重复3次
let reg2=/ab{2}/g; //b重复2次
let reg3=/(ab){2}/g; //ab重复2次

//()分组
let str4="my nama is LiLei"
let reg4=/LiL|lei/ // | 或字符会隔开前后字符串
// /Li(L|l)ei/ <=> /Li[Ll]ei/ //变成了 Li+L|i+ei
let res3=str4.replace(reg4,'李雷')

// 反向引用 1.用()分组 2.$1 $2 $3 加引号
let time="2019-10-21"
let reg=/(\d{4})-(\d{1,2})-(\d{1,2})/g
let res=time.replace(reg,"$3/$2/$1") //"$3/$2/$1" $是特殊字符
console.log(res) //21/10/2019
console.log(RegExp.$1) //2019

//分组命名 Es2018
let str="$name=zhang&age=19"
// let reg=/\$\w+/g //$需要转义
let reg=/\$(?<str1>\w+)/ //$需要转义 
//匹配以$开头+数字字母下划线,只匹配数字字母下划线
let res=str.match(reg)//分组只有在单个模式匹配才会体现res.groups.str1

零向断言 正向(后面) 负向(前面) ==> true/false

肯定:正常 否定:符合表达式字符串其他的部分

// 零向断言 正向(后面) 负向(前面) ==> true/false

// 正向肯定断言 正则表达式的后面 (?=表达式) 匹配的时候匹配上,替换的时候不替换
let str="iphone1iphone3iphone3iphoneNum"
// let reg=/iphone\d{1,2}/g //🍎🍎🍎iphoneNum
let reg=/iphone(?=\d{1,2})/g //🍎1🍎3🍎3iphoneNum  匹配整个表达式,不替换后面的
let res=str.replace(reg,'🍎')


// 正向否定断言 正则表达式的后面 (?!表达式) 除了符合表达式的字符串的其他部分
let str="iphone1iphone3iphone3iphoneNum"
let reg=/iphone(?!\d{1,2})/g 
let res=str.replace(reg,'🍎') //iphone1iphone3iphone3🍎Num


// 负向断言 
// 负向肯定断言 正则表达式的前面 (?<=表达式) 匹配的时候匹配上,替换的时候不替换
let str="10px20px30pxipx"
// px==>像素
// let reg=/px/g 
// let reg=/\d{2}px/g 
let reg=/(?<=\d{2})px/g  //匹配带有数字+px的,只替换px
let res=str.replace(reg,'像素') // "10像素20像素30像素ipx"


// 负向否定断言 正则表达式的前面 (?<!表达式) 
let str="10px20px30pxipx"
let reg=/(?<!\d{2})px/g  
let res=str.replace(reg,'像素') // "10px20px30pxi像素"


//匹配整个表达式,不替换()部分
//正向肯定 (?=表达式) 表达式的后面,
//正向否定 (?!表达式) 表达式的后面,正则式取非
//负向肯定 (?<=表达式) 表达式的前面,
//负向否定 (?<=表达式) 表达式的前面,正则式取非

匹配模式

    //g:全局匹配
    //i:忽略大小写
    //m:多行模式
{
    let str="abcdAd"
    let reg=/a/gi //匹配模式:全局;忽略大小写
    let res=str.replace(reg,'*')
    console.log(res)
    let str1=`abc
dAd`
    let reg1=/^\w/gm
    let res1=str1.replace(reg1,'*')
    console.log(res1)
}
    
{
    let str=`<div>somed
    dss99..</div>`
    // let reg=/<div>.*<\/div>/g; //.:匹配除了 \n \r \u2028段落结束符 \u2029行结束符之外的字符 ,但这个地方有换行,所以匹配不上
    let reg=/<div>.*<\/div>/gs; //s 匹配换行 true
    let res1=reg.test(str)
    console.log(res1)
}   
{
    // u:匹配unicode编码
    console.log(/^.$/u.test("\ud842\udf87"))
    // y:粘性模式 匹配正则中lastindex属性指定位置的字符,并且如果没有匹配也不会尝试从任何后续的索引中进行匹配

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容