美文网首页
JavaScript正则表达式全解

JavaScript正则表达式全解

作者: percykuang | 来源:发表于2019-10-22 23:39 被阅读0次

正则表达式

reg.test(str)

var reg = /abc/

var str = 'abcd'

// 判断str里是否有reg表达式规定的片段,返回boolean
// reg.test(str) 

// true
console.log(reg.test(str))

模式 i

// 在正则表达式后面加i,表示忽略大小写
var reg = /abc/i

var str = 'abCd'

// true
console.log(reg.test(str))

使用构造函数创建正则表达式

// 第一个参数是匹配字段 第二个参数是匹配模式
var reg = new RegExp('abc', 'i')

var str = 'abCd'

// true
console.log(reg.test(str))

// 第一个参数还可以添加已知的正则表达式
var reg = /abcd/i

// 这样创建的reg1类似于深克隆
var reg1 = new RegExp(reg)

// 这样创建的reg2类似于浅克隆
var reg2 = RegExp(reg)

模式 g

g 表示全局匹配

str.match(reg)

// 不加模式 g
var reg = /ab/

var str = 'ababbababaab'

// str.match(reg) 可以把str里符合reg匹配的片段挑出来然后返回这个片段数组

// ['ab']
console.log(str.match(reg))

// ----------------------------------------

// 加模式 g

var reg = /ab/g

var str = 'ababbababaab'

// str.match(reg) 可以把str里符合reg匹配的片段挑出来然后返回这个片段数组

// 因为这个reg加了模式g,所以会找到所有的匹配片段

// ['ab', 'ab', 'ab', 'ab', 'ab']
console.log(str.match(reg))

模式 m

多行匹配模式,如果你不知道,看下面的代码示例吧

var reg = /a/g

var str = 'abcdea'

// ['a', 'a']
console.log(str.match(reg))

// 以a开头的a
var reg1 = /^a/g 

// ['a']
console.log(str.match(reg1))

// 如果str换个行呢
var str1 = 'abcde\na'

// ['a']  --- 因为还不具备多行匹配的功能
console.log(str1.match(reg1))

// 现在我们来添加多行匹配的功能

var reg2 = /^a/mg

// 现在就可以匹配到了 
// ['a', 'a']
console.log(str1.match(reg2))

表达式 []

一个[]表示一位,这个里面可以指定范围

逐个指定


var str = '2sfsf1233jajfsj3'

// 要求:正则表达式需要去匹配str中有没有3个数字连在一起的情况
var reg = /[1234567890][1234567890][1234567890]/g

// ['123', '987']
console.log(str.match(reg))

// 也可以这样玩
var reg1 = /[ef][sj]/g

// ['fs', 'fs']
console.log(str.match(reg1))

范围指定

var str = '2sfsf1233ja98765jfsj3'

// 要求:正则需要去匹配str中有没有3个数字连在一起的情况
var reg = /[0-9][0-9][0-9]/g

// ['123', '987']
console.log(str.match(reg))

var reg1 = /[0-9a-z][3]/g

// ['23', 'j3']
console.log(str.match(reg1))

var reg2 = /[0-9A-z][0-9A-z][j]/g

// [ '33j', '65j', 'fsj' ]
console.log(str.match(reg2))

特殊字符 ^

^放到[]里面表示的是,和放到[]外面意义不一样

var str = 'ab1cd'

var reg = /[^a][^b]/g

// ['b1', 'cd']
console.log(str.match(reg)) 

特殊字符()|

// 表示匹配abc或者bcd
var reg = /(abc|bcd)/g

// ['abc']
console.log('abcd'.match(reg))

// ['bcd']
console.log('bcdedf'.match(reg))

// ['bcd0']
console.log('bcd0df'.match(reg))

特殊字符^$

^n 表示以n开头,m$ 表示以m结尾

var reg = /^ab/g

var str = 'abc'

// [ 'ab' ]
console.log(str.match(reg))

var reg1 = /bc$/g

// ['bc']
console.log(str.match(reg1))

// 注意下面这种情况 它的意思是以a开头,以b结尾,中间有一个b
// var reg = /^abc$/g

// var str = 'abcabc'

// // null
// console.log(str.match(reg))

元字符

\w

表示word字符,可以认为\w === [0-9A-z_]

\W

\w的补集,可以认为\W === ^0-9A-z

var str = 'sdf'

var reg = /\w/g

var reg1 = /\W/g

// ['s', 'd', 'f']
console.log(str.match(reg))

// null
console.log(str.match(reg1))

\d

表示数字字符,可以认为\d === [0-9]

\D

\d的补集,可以认为\D === [^0-9]

var str = '123'

var reg = /\d\d\d/g

// ['123']
console.log(str.match(reg))

// [] 里面也可以写元字符
var reg1 = /[\w\d]/g

// ['1', '2', '3']
console.log(str.match(reg1))

\s

表示空白字符,包含空格符、制表符、回车符、换行符等,可以认为\s === [\t\n\r\v\f(还有空格)]

\S

表示[^\s]

\b

表示单词边界

\B

表示非单词边界

var reg = /\bcde/g

// 这里有6个单词边界
var str = 'abc cde fgh'

// ['cde']
console.log(str.match(reg))

var reg1 = /\bcde\b/g

// ['cde']
console.log(str.match(reg1))

str = 'abc cdefgh'

// null
console.log(str.match(reg1))

var reg2 = /\bcde\B/g

// ['cde']
console.log(str.match(reg2))

\n

表示换行符

\t

表示制表符

var str = '1321\nad'

var reg = /\na/g

// ['\na']
console.log(str.match(reg))

\uxxxx

unicode编码

var reg = /\u524d\u7aef/g

var str = '前端工程师'

// ['前端']
console.log(str.match(reg))

.

. === [^\r\n],匹配除了\r,\n外的所有的字符

量词

n+

表示n可以出现一次到多次

n*

表示n可以出现0次到多次

var reg = /\w+/g

var str = 'abc'

// ['abc']
console.log(str.match(reg))

var reg1 = /\w*/g

// ['abc', ''] 注意这里会多一个空字符
console.log(str.match(reg1))

// 这样会出现4个空字符 *会在逻辑上,也就是光标后再多匹配一位空字符
var reg2 = /\d*/g

// ['', '', '', '']
console.log(str.match(reg2)) 

贪婪匹配原则--能匹配多就不匹配少

var reg = /\w+/g

var str = 'aaaaaaaaaaaaa'

// ['aaaaaaaaaaaaa']
console.log(str.match(reg))

n?

匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}。

var reg = /\w?/g

var str = 'aaa'

// [ 'a', 'a', 'a', '' ]
console.log(str.match(reg))

n{x}

表示n只能出现x次

n{x,y}

表示可以出现x次到y次

n{x,}

表示可以出现x次到多次

var reg = /\w{3}/g

var str = 'abc'

// [ 'abc' ]
console.log(str.match(reg))

var reg1 = /\w{1,}/g

// ['abc']
console.log(str.match(reg1))

做做题

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

var str = '1fsdljf1231'

var reg = /^\d|\d$/

// true
console.log(reg.test(str))

2.检验一个字符串首尾是否同时含有数字

var str = '1dfasfasdf2'

var reg = /(^\d)[\d\D]*(\d$)/

// true
console.log(reg.test(str))

正则表达式的属性

var reg = /flinn/gi

// true
console.log(reg.global)

// true
console.log(reg.ignoreCase)

// false
console.log(reg.multiline)

// 'flinn'
console.log(reg.source)

正则表达式的方法

test

exec & 属性lastIndex

var str = 'abababab'

var reg = /ab/g

// 0
console.log( reg.lastIndex )
// [ 'ab', index: 0, input: 'abababab']
console.log( reg.exec(str) )

// 2
console.log( reg.lastIndex )
// [ 'ab', index: 2, input: 'abababab']
console.log( reg.exec(str) )

// 4
console.log( reg.lastIndex )
// [ 'ab', index: 4, input: 'abababab']
console.log( reg.exec(str) )

// 6
console.log( reg.lastIndex )
// [ 'ab', index: 6, input: 'abababab']
console.log( reg.exec(str) )

// 8
console.log( reg.lastIndex )
// null
console.log( reg.exec(str) )

// 0
console.log( reg.lastIndex )
// [ 'ab', index: 0, input: 'abababab']
console.log( reg.exec(str) )

手动修改lastIndex,会产生作用

var str = 'abababab'

var reg = /ab/g

// 0
console.log( reg.lastIndex )
// [ 'ab', index: 0, input: 'abababab']
console.log( reg.exec(str) )

reg.lastIndex = 0

// [ 'ab', index: 0, input: 'abababab']
console.log( reg.exec(str) )

注意

如果匹配模式不是g,那么lastIndex将永远是0,也就是exec永远从下标0开始匹配。

子表达式及其反向引用

需求:匹配xxxx型的字符串

var str = 'aaaa'

// (\w)表示一个子表达式 \1表示反向引用第`1`个子表达式的内容
var reg = /(\w)\1\1\1/g

// ['aaaa']
console.log(str.match(reg))

需求:匹配xxyy型的字符串

var str = 'aabb'

// (\w)表示一个子表达式 \1表示反向引用第1个子表达式的内容
// \2 表示反向引用第2个子表达式的内容
var reg = /(\w)\1(\w)\2/g

// ['aabb']
console.log(str.match(reg))

使用子表达式后再用exec方法

var str = 'aabb'

// (\w)表示一个子表达式 \1表示反向引用第1个子表达式的内容
// \2 表示反向引用第2个子表达式的内容
var reg = /(\w)\1(\w)\2/g

// 这里会多出两位:'a' 和 'b'
// [ 'aabb', 'a', 'b', index: 0, input: 'aabb']
console.log(reg.exec(str))

支持正则表达式的字符串方法

match(reg)

加g可以匹配多个片段,不加g匹配一个

var str = 'aabb'

// 不加g
var reg = /(\w)\1(\w)\2/

// [ 'aabb', 'a', 'b', index: 0, input: 'aabb']
console.log(str.match(reg))

// 加g
var reg1 = /(\w)\1(\w)\2/g

// [ 'aabb' ]
console.log(str.match(reg1))

search(reg)

返回匹配到的位置下标,加不加g都只匹配第一个满足条件的下标为止,没匹配到返回-1

var str = 'faabb'

var reg = /(\w)\1(\w)\2/
var reg1 = /(\w)\1(\w)\2/g

// 1
console.log(str.search(reg))
// 1
console.log(str.search(reg1))

split(reg)

按照reg匹配规则来打散字符串为一个数组

var str = 'faabb'

var reg = /aa/

// ['f', 'bb']
console.log(str.split(reg))

replace(reg, s)

var str = 'faabb'

// 不使用正则表达式,则没有访问全局的能力
// 'fbabb'
console.log(str.replace('a', 'b'))
需求:将xxyy转为yyxx
var str = 'aabb'

var reg = /(\w)\1(\w)\2/g

// 可以使用$,来引用子表达式
// 'bbaa'
console.log(str.replace(reg, '$2$2$1$1'))

// 另一种牛逼的形式,调用方法
// 在这里,result为'aabb', $1、$2分别为第1和第2个子表达式的引用
// 'bbaa'
console.log(str.replace(reg, function (result, $1, $2) {
  return $2 + $2 + $1 + $1
}))
需求:将this-first-name这种类型的命名转为小驼峰命名形式
var str = 'the-first-name'

var reg = /-(\w)/g

// 'thisFirstName'
console.log(str.replace(reg, function (result, $1) {
  return $1.toUpperCase()
}))

正向预查

需求:在aabaaaa中找出后面跟的是b的那个a

var str = 'aabaaa'

// 表示a后面跟的是b,但是b不参与匹配,只参与限定
var reg = /a(?=b)/g

// ['a']
console.log(str.match(reg))

需求:在aabaaaa中找出后面不跟的是b的那个a

var str = 'aabaaa'

// 表示a后面跟的是b,但是b不参与匹配,只参与限定
var reg = /a(?!b)/g

// ['a', 'a', 'a', 'a']
console.log(str.match(reg))

非贪婪匹配

只需在量词后面加一个?,那么它将遵循能少就不多匹配的原则(至少会匹配一个)

var str = 'aaaa'

var reg = /a+?/g

// ['a', 'a', 'a', 'a']
console.log(str.match(reg))

var reg1 = /a??/g

// [ '', '', '', '', '' ]
console.log(str.match(reg1))

做做题

需求:将aaaabbbbbccc转为abc(字符串去重)

var str = 'aaaaabbbbbccc'

var reg = /(\w)\1*/g

// 'abc'
console.log(str.replace(reg, '$1'))

一道难题:将一个字符串每隔三位打个点

var str = '179023240000'

var reg = /(?=(\B)(\d{3})+$)/g

// 179.023.240.000
console.log(str.replace(reg, '.'))

相关文章

  • JavaScript正则表达式全解

    正则表达式 reg.test(str) 模式 i 使用构造函数创建正则表达式 模式 g g 表示全局匹配 str....

  • javascript函数全解

    0.0 概述 本文总结了js中函数相关的大部分用法,对函数用法不是特别清晰的同学可以了解一下。 1.0 简介 同其...

  • JavaScript编程全解

    日本人写的,看了前5章还不错 有很多java跟js的对比 就是勘误太多 http://www.ituring.co...

  • 原生js的基础方法等二

    JavaScript 正则表达式 正则表达式模式 调试 this JSON 字符串转换为 JavaScript 对...

  • day5-正则表达式学习(基于JavaScript)

    JavaScript正则表达式 什么是正则表达式

  • Javascript 编程全解(笔记一)

    函数JavaScript 的函数是一种对象。 对象 Javascript 中没有类这样的语言结构, Javascr...

  • JavaScript-Vue进阶全解

    今天本仙女给大家来介绍一下最喜欢的JS框架Vue的基本用法。 Vue解答 Vue (读音 /vjuː/,类似于 v...

  • JS 正则表达式

    语法 常用的方法: javascript中如何声明一个正则表达式对象在JavaScript当中,声明一个正则表达式...

  • 正则

    1 JS之正则表达式15个常用的javaScript正则表达式

  • 正则表达式

    了解正则表达式基本语法 能够使用JavaScript的正则对象 正则表达式简介 什么是正则表达式 正则表达式:用于...

网友评论

      本文标题:JavaScript正则表达式全解

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