前端:正则表达式详解

1.介绍

正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript 中,正则表达式也是对象。这些模式被用于 RegExpexectest 方法,以及 StringmatchmatchAllreplacesearchsplit 方法。本章介绍 JavaScript 正则表达式

正则表达式(Regular Expression)描述了一种字符串匹配的模式

  • 可以用来检查一个字符串中是否含有某种子串,比如 Hello World中是否含有大写字母
  • 将匹配的子串做替换,比如将 this is javascript中每个单词首字母变为大写
  • 验证字符串是否符合条件,比如 验证输入的用户名是否是由数字字母组合而成的
  • .......

匹配就是在某个字符串中查找你想要查找的内容(由正则表达式决定),如果查找到了,就表示匹配。没有查找到就表示不匹配。

正则表达式本身是一门独立的技术,可以被大多数编程语言所使用,如Javascript、PHP、Java…

使用场景:

  • 例如验证表单:手机号表单要求用户只能输入11位的数字 (匹配)
  • 过滤掉页面内容中的一些敏感词(替换),或从字符串中获取我们想要的特定部分(提取)等

 2.正则的基本使用

2.1 定义正则

const reg =  /表达式/

  • 正则表达式使用 斜线 作为起始和结尾标识符,两条斜线之间写正则表达式
  • 正则表达式也是对象

2.2 正则方法 

test() - 执行正则匹配。匹配返回true,不匹配返回false

exec() - 方法执行一个正则匹配,返回一个包含结果的数组或null。并将表示匹配的位置 置为下一个匹配的位置

match() - 执行正则匹配,返回匹配的结果或null

replace() - 使用正则表达式进行匹配,并将匹配的结果替换

split() - 使用正则表达式进行匹配,并使用匹配的结果分割字符串为数组

search() - 在字符串中搜索符合正则匹配的结果,返回匹配字符的位置或 -1

 2.3 使用正则

  • test()方法 用来查看正则表达式与指定的字符串是否匹配
  • 如果正则表达式与指定的字符串匹配 ,返回true,否则false
  • // 1.先定义一个正则表达式
    let reg = /前端/
    // 2.调用 test() 方法进行测试【如果是字符串有连续的 前端 字样,结果就是true, 否则为false】
    console.log(reg.test('前端学习')) // true
    console.log(reg.test('学前端要有兴趣')) // true
    console.log(reg.test('前后端我都要学')) // false

 3.边界符

正则表达式中的边界符(位置符)用来提示字符所处的位置,可以判断字符串的开头是什么,结尾是什么,还能精确判断整个字符串是什么,主要有两个字符

边界符

说明

^

开头判断,表示匹配行首的文本(以谁开始)

$

结尾判断,表示匹配行尾的文本(以谁结束)

如果 ^ 和 $ 在一起,表示必须是精确匹配

// 1. 定义正则表达式
let reg = /^web/  // 开头必须是web
let reg2 = /web$/ //  结尾必须是web
// 2. 验证
console.log(reg.test('移动web'))  // false
console.log(reg.test('webAPIs')) // true

console.log(reg2.test('移动web')) // true
console.log(reg2.test('webAPIs')) // false       
        
// -----------3.精确匹配----------------
// 如果^ 和 $ 符号都用上,表示精确匹配
let reg3 = /^web$/   // 这种写法,只有  web 和他匹配
console.log(reg3.test('web')) // true
console.log(reg3.test('webweb')) // false

 4.字符类

量词语法

描述

.

匹配除换行符之外的任何单个字符

[abc]

匹配 [] 中的任意字符(字符串中只要包含a或者b或者c,就算匹配,全都不包括则不匹配)

[^abc]

和 [abc] 相反;匹配除了abc以外的其他任意字符

[0-9]

匹配0~9之间的任意一个数字。也可以写成 [5-8]这种,表示匹配 5~8 之间的任意一个数字

[a-z]

匹配一个小写字母,也可以写成 [a-f] 这种,表示匹配 a~f 之间的任意一个字母

[A-Z]

和 [a-z] 类似,只不过匹配大写字母

[A-z]

匹配大写字母、小写字母、_ \ [ ] ` ^ 中的任意一个字符

[0-9a-zA-Z]

匹配任意一个数字、字母

\d

匹配任意一个数字,相当于 [0-9]

\D

匹配任意一个非数字 字符,相当于 [^0-9]

\w

匹配大写字母、小写字母、下划线 中的任意一个字符,相当于 [A-z]

\W

和 \w 相反,匹配除了大写字母、小写字母、下划线以外的任意一个字符

\s

匹配一个空白字符,包括换行符、制表符、空格符等

\S

匹配一个非空白字符,和 \s 相反

5. 元字符

  • 一元运算符,参与运算的  表达式或变量 只有一个 比如:a++
  • 二元运算符,参与运算的 表达式或变量 有两个  比如:a + b
  • 三元运算符,参与运算的 表达式或变量 有三个 比如: a > b ? xxx : yyy

元字符的基本使用 

// ---------正则表达式——元字符---------
// 正则中的元字符,首先表示字符,但是只表示一个字符

// \w 表示数字字母下划线   \d 表示数字  \s 表示空白
// \W 表示非数字字母下划线  \D  表示非数字   \S 表示非空白

let reg = /\w/  // 这不是精准匹配,所以下面的字符串只要出现了数字、字母、下划线就可以
console.log(reg.test('!@#$%^&*'))  // false
console.log(reg.test('你好'))  // false
console.log(reg.test('a你好'))  // true
console.log(reg.test('A你好'))  // true
console.log(reg.test('9你好'))  // true
console.log(reg.test('_你好'))  // true

let reg2 = /^\w$/  // 这是精准匹配,又因为 \w 表示一个字符,所以只匹配一个字符
console.log(reg2.test('ab')) // false 因为 \w 只能匹配一个字符
console.log(reg2.test('中')) // false 
console.log(reg2.test('a')) // true
console.log(reg2.test('6')) // true
console.log(reg2.test('_')) // true
console.log(reg2.test('A')) // true

元字符之方括号 
 

// [abc] [^abc] [389] [a-z] [A-Z] [0-9] [^a-z] [3-7] [a-z0-9] 表示一个范围内的字符

// 1.[abc] 匹配a、b、c、中的一个字符,如果字符串中有a或者b或者c,都匹配,当然,有ab更匹配
// 在精确匹配模式中,[abc]只能匹配匹配一个字符
let reg = /[abc]/
console.log(reg.test('def')) // false def中没有a,也没用b,也没有c
console.log(reg.test('daf'))  // true daf中有 a
console.log(reg.test('abf'))  // true abf中既有a,又有b

let reg = /^[abc]$/  // 只能匹配 a 或者 b 或者 c
console.log(reg.test('a')) // true
console.log(reg.test('b')) // true
console.log(reg.test('c')) // true
console.log(reg.test('d')) // false
console.log(reg.test('abc')) // false

// 2. [^xxx] 表示取反
let reg = /^[^abc]$/   // 匹配除了a、b、c以外的其他字符
console.log(reg.test('mn'))  // false 不匹配,因为一个方括号只能匹配一个字符
console.log(reg.test('b')) // false
console.log(reg.test('m')) // true
console.log(reg.test('$')) // true
console.log(reg.test('中')) // true 

// 3. [a-z] [b-f] [0-9] [A-Z] [3-7] 都表示一个范围
let reg = /^[a-z]$/
console.log(reg.test('b')) // true
console.log(reg.test('bc')) // false
console.log(reg.test('B')) // false

let reg2 = /^[3-7]$/ // 匹配3~7之间的一个数字,包括3和7
console.log(reg2.test(6)) // true
console.log(reg2.test(7)) // true
console.log(reg2.test(2)) // false

// 4.组合写法
let reg = /^[0-9_acf]$/ // 匹配数字、_、a、c、f
console.log(reg.test('8')) // true
console.log(reg.test('_')) // true
console.log(reg.test('c')) // true
console.log(reg.test('d')) // true

 6.量词

  • ?  表示前面的【一个】字符,可以有0个或1个,比如 /ab?c/ 表示b可以有0个或1个,ac、abc都和模式匹配
  •  +   表示1个或多个
  •  *   表示任意个(0个、1个、2个....n个)
  •  {n}  表示n个
  •  {n,}   表示至少n个
  •  {n,m}  表示 n <= 个数 <= m  【坑点:中间不要加空格,比如{n, m}就是错的】
  • 注意: 逗号左右两侧千万不要出现空格
let reg = /^a?$/
console.log(reg.test('')) // true
console.log(reg.test('a')) // true
console.log(reg.test('aa')) // false

let reg1 = /^\w?$/  // 表示匹配0个或1个  数字字母下划线
let reg2 = /^[a-z0-9]?$/  // 表示匹配0个或1个  数字或小写字母

let reg3 = /^[a-z][0-9]?$/ // 匹配必须有一个小写字母,后面的数字可以有0个或1个
console.log(reg3.test('99')) // false
console.log(reg3.test('A9')) // false
console.log(reg3.test('a9')) // true
console.log(reg3.test('a')) // true


// 用户名要求必须是小写字母,长度只能是6~10位
let reg4 = /^[a-z]{6,10}$/
console.log(reg4.test('abcdefg')) // true
console.log(reg4.test('abc')) // false
console.log(reg4.test('abcdefgzxczxczcgsdgasgsf')) // false

 7.分组与引用
 

// 分组,就是用小括号分组
// 13266668888
// 132****8888
// (\d\d\d)  \d\d\d\d  (\d\d\d\d)

// 要求匹配4个数字,要求前两位相同,后两位相同  比如,3388 4455
let reg1 = /^(\d)\1(\d)\2$/
// (\d) 匹配一个数字,加了小括号,表示捕获这个数字(知道这个数字是什么)
// \1 表示要和第1个小括号的内容一致
// \2 表示要和第2个小括号的内容一致
// \3 .........................
console.log(reg1.test('1234')) // false
console.log(reg1.test('5566')) // true
console.log(reg1.test('8888')) // true

//  要求匹配4个连续的数字,要求2、3位置的数字要一致;1/4位相同
let reg = /^(\d)(\d)\2\1$/

console.log(reg.test('1221')) // true
console.log(reg.test('1223')) // false
console.log(reg.test('2222')) // true

8.修饰符

修饰符要放到 /xxx/ 之后,比如 g 就是一个修饰符。多个修饰符可以一起使用。

量词语法

描述

g

是单词 global 的缩写,匹配所有满足正则表达式的结果

i

是单词 ignore 的缩写,正则匹配时字母不区分大小写

let str = 'this is a Javascript'
// -------写到/xxx/后面的字符,叫做修饰符---------------
// g -- global 全局的,下面的例子,加入g表示全局替换
console.log(str.replace(/s/g, 'S'))

// ------ignore  忽略,加入这个修饰符,不区分大小写--
let str2 = 'This is a JS'
console.log(str2.replace(/s/gi, '默语'))

 9.替换

 replace 替换方法,可以完成字符的替换



// ------------字符串.replace()  // 替换字符方法 -----
// 字符串.replace(/正则表达式/, '替换的文本')

let str = 'this is a Javascript'
console.log(str.replace('s', 'S')) // 默认只换找到的第1个字符
console.log(str.replace(/s/, 'S')) // 默认只换找到的第1个字符

10.匹配中文

// 为了表示世界上所有的字符,创造了 Unicode 编码
// 每一个Unicode编码对应一个字符
// 具体的Unicode编码表:http://www.tamasoft.co.jp/en/general-info/unicode.html
let reg = /^[\u4e00-\u9f5a]$/
console.log(reg.test('hello')) // false
console.log(reg.test('你好')) // false(中括号只能显示一个字符)
console.log(reg.test('你')) // true
  • 30
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值