zl程序教程

您现在的位置是:首页 >  Javascript

当前栏目

js正则表达式梳理

2023-02-25 18:27:46 时间

正则表达式简介

正则表达式(Regular Expression): 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的租和,组成一个“规则字符串”,这个规则字符串用来表达对字符串的一种过滤逻辑。

正则表达式的作用

  1. 给定的字符串是否符合正则表达式的过滤逻辑(匹配)。
  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分(提取)。
  3. 强大的字符串替换能力(替换)。

正则表达式的组成

  • 普通字符 abc 中国 123 等
  • 特殊字符(元字符、限定符、中括号):正则表达式中有特殊意义的字符。

元字符

元字符就是在正则表达式中具有特殊含义的字符。

元字符

说明

.

匹配任意除了换行符(回车键)之外的单个字符

\d

匹配数字

\D

匹配非数字

\w

匹配字母、数字、下划线

\W

匹配非字母、数字、下划线

\s

匹配空格

\S

匹配非空格

\b

匹配单词边界

\B

匹配非单词边界

\0

匹配NULL字符

\n

匹配换行符

\t

匹配制表符

\v

匹配垂直制表符

\xxx

查找以八进制数 xxxx 规定的字符

\uxxxx

查找以十六进制 xxxx规定的 Unicode 字符

数量符

控制字符出现的次数,对字符个数限制

数量符

说明

n*

匹配任何包含零个或者多个n的字符串。n{0,}

n+

匹配任何包含至少一个n的字符串。n{1,}

n?

匹配任何包含零个或一个n的字符串。{0,1}

n{x}

匹配包含x个n的序列的字符串。

n{x,}

匹配包含至少x个n的序列的字符串。

n{x,y}

匹配包含至少x个至多y个n的序列的字符串。

n$

匹配任何结尾为n的字符串。

^n

匹配任何开头为n的字符串。

范围符

一个中括号就代表一个字符串,中括号的目的解视控制一个字符的范围。

中括号

说明

[abc]

查找一个括号之间的任何字符。

[^abc]

查找一个任何不在方括号之间的字符,^在中括号中有取反的意思。

[0-9]

查找一个任何从0至9的数字。

[a-z]

查找一个任何从小写a到小写z的字符。

[A-Z]

查找一个任何从大写A到大写Z的字符。

[A-z]

查找一个字母(包含大小写和下划线)。

[[u4e00-u9fa5]]

查找一个汉字。

选择符

特殊符号:正则1|正则2。 符合或两边其中一个就可以匹配。

如:google,baidu,bing; // 匹配三种其中一种字符串

正则:google|baidu|bing

特殊符号: (正则) ;

组指的是一个小集体,分组就是将一个大集体可以分成几个小集体。

如:控制你的名字连续出现的次数,最少1次,最多3次

正则:^(hyl){1,3}$

修饰符

修饰符

说明

g

全局匹配。 如: var reg = /hello/g

i

全局忽略大小写。 如: var reg = /Hello/i

gi

全局匹配且忽略大小写。 如: var reg = /Hello/gi

位置符

位置符

说明

^

匹配开头

$

匹配结尾

(?=p)

符合p子模式前面的位置

(?!p)

除了(符合p子模式前面的位置)的所有位置

(?<=p)

符合p子模式后面的位置

(?<!p)

除了(符合p子模式后面的位置)的所有位置

转义符

在正则中表示特殊符号。去除.的特殊意义,需要转义: \.

贪婪匹配 VS 惰性匹配

正则本身是贪婪的,会尽可能的多匹配符合模式的字符

1let regex = /\d{2,5}/g
2let string = "123 1234 12345 123456"
3// 贪婪匹配
4// string.match(regex) // [ 123, 1234, 12345, 12345 ]
5
6// 惰性匹配
7let regex2 = /\d{2,5}?/g
8// string.match(regex) // [ 12, 12, 34, 12, 34, 12, 34, 56  ]
9

量词后面加一个?,即变成了惰性匹配

js中使用正则表达式

1//方式1: 语法: var 变量 = new RegExp("规则","修饰符")
2var reg = new RegExp("d","g")
3
4//方式2: 语法:var 变量 = /正则表达式/ (推荐使用)
5var reg = /d/g;

相关正则方法

  • 正则对象.test(字符串); 校验匹配正则的子字符串,返回布尔值。
  • 字符串.match(正则对象); 获取匹配正则的子字符串,返回一个数组。
  • 字符串.replace(正则对象,替换后的内容); 替换所匹配正则的子字符串。返回替换后的字符串。

替换类案例

字符串开头或结尾塞一个笑脸

1let string = "hello"
2
3console.log(string.replace(/^/, "?")) // ?hello
4console.log(string.replace(/$/, "?")) // hello?

数字千位分割

1let price = "123456789"
2let priceReg = /(?!^)(?=(\d{3})+$)/g
3
4console.log(price.replace(priceReg, ",")) // 123,456,789

手机号3-4-4转换

1const formatMobile = (mobile) => {
2  return String(mobile).slice(0,11)
3      .replace(/(?<=\d{3})\d+/, ($0) => "-" + $0)
4      .replace(/(?<=[\d-]{8})\d{1,4}/, ($0) => "-" + $0)
5}
6
7console.log(formatMobile(123)) // 123
8console.log(formatMobile(1234)) // 123-4
9console.log(formatMobile(12345)) // 123-45
10console.log(formatMobile(123456)) // 123-456
11console.log(formatMobile(1234567)) // 123-4567
12console.log(formatMobile(12345678)) // 123-4567-8
13console.log(formatMobile(123456789)) // 123-4567-89
14console.log(formatMobile(12345678911)) // 123-4567-8911
15

验证密码的合法性

密码长度是6-12位,由数字、小写字符和大写字母组成,但必须至少包括2种字符

1let reg = /((?=.*\d)((?=.*[a-z])|(?=.*[A-Z])))|(?=.*[a-z])(?=.*[A-Z])^[a-zA-Z\d]{6,12}$/
2
3console.log(reg.test("123456")) // false
4console.log(reg.test("aaaaaa")) // false
5console.log(reg.test("AAAAAAA")) // false
6console.log(reg.test("1a1a1a")) // true
7console.log(reg.test("1A1A1A")) // true
8console.log(reg.test("aAaAaA")) // true
9console.log(reg.test("1aA1aA1aA")) // true
10