JavaScript 正则表达式

目录

一. 正则表达式简介

1. 什么是正则表达式?

2. 为什么要用正则表达式?

3. 正则表达式的几种风格(标准)

二. 基本语法

1. 界定符

1.1 界定符的几种写法

2. 原子

2.1 原子的分类

2.2 汉字匹配问题

2.3 关于转义

2.4 元字符是什么

2.5 元字符三种类型

2.6 内置原子集合(元字符)

3. 量词

3.1 量词的三种写法

3.2 特殊量词

4. 边界控制

5. 修正模式

6. 贪婪模式、懒惰模式

7. 关于 ?

7.1 (?=) 和 (?!) → 正向断言 和 负向断言

7.2 ?: 可以产生没有编号的分组

三. 常用正则表达式设计

1. 设计思路

2. 常用正则表达式

四. JavaScript 正则表达式方法

1. 常见正则表达式方法

2. regexObj.test(str)

3. str.replace(regexp|substr, newSubStr|function)


一. 正则表达式简介

1. 什么是正则表达式?

正则表达式(Regular Expression):一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

正则表达式 是一种 字符串搜索 和 匹配 的工具

2. 为什么要用正则表达式?

典型的搜索和替换操作,要求用户提供:与预期搜索结果 完全匹配的 确切文本

因此,缺乏灵活性,采用这种方法搜索动态文本,会变得很困难

3. 正则表达式的几种风格(标准)

  • grep
  • egrep
  • POSIX
  • Perl
  • PCRE

二. 基本语法

正则表达式测试工具

http://reg.1zdz.cnhttp://reg.1zdz.cn/

1. 界定符

界定符:表示一个正则表达式的开始和结束

1.1 界定符的几种写法

  • / 正则表达式  /
  • # 正则表达式 #
  • { 正则表达式  }

在 JavaScript 中,界定符以斜线(/)开始和结束

const reg = /正则表达式/;

字符串是通过单引号或者双引号界定,那么正则的界定就好理解了吧

2. 原子

原子:正则表达式中最小的匹配单位

2.1 原子的分类

  • 可见原子:/A/     /,/     / /
  • 不可见原子:空格、\n、\t、\r
const reg = /A/;
const reg = /,/;
const reg = / /;

以上正则表达式中,均只有一个原子

一篇文章的最小单位是一个文字或者一个单词,他们组合在一起就是一篇文章,正则表达式也是有原子组合而来的

2.2 汉字匹配问题

汉字先转换成 Unicode 编码,再写入正则表达式中,进行匹配

2.3 关于转义

匹配某些符号(被正则表达式使用的符号)

\$、\.、\+、\\、/[.]/

2.4 元字符是什么

元字符:一系列原子集合

元字符作用:定义原子的筛选方式;对某一类原子归类缩写;

2.5 元字符三种类型

或:原子 | 原子(例如:/t|T/)

任一:[原子原子...](例如:/[tT]/)

常见的 “任一” 正则表达式:[0-9]    [a-z]    [A-Z]    [\u4e00-\u9fa5]

除此之外:[^原子原子...](例如:/[^tT]/)

 

原子|原子    // 表示:或(匹配其中一个原子即可)
[原子原子...]  // 表示:任一(匹配括号里的任一一个原子即可,原子之间不用竖线)
[^原子原子...] // 表示:除此之外(和前一种情况相反)

 

中括号中,如果原子是连续的(ASCII 码),那么可以用横线(-)表示连续:

[0123456789] = [0-9]
[abcdefghijklmn] = [a-n]

 

2.6 内置原子集合(元字符)

元字符

解释

等价于

.

除换行符之外任意一个字符

\d

匹配任意一个十进制数

[0-9]

\D

匹配任意一个非十进制数

[^0-9]

\s

匹配一个不可见原子

[\f\n\r\t\v]

\S

匹配一个可见原子

[^\f\n\r\t\v]

\w

匹配任意一个数字、字母、下划线

[0-9a-zA-Z_]

\W

匹配任意一个非数字、字母、下划线

[^0-9a-zA-Z_]

【举个栗子】/ES\d/  -> -> -> ES0   ES1  ES5

单词可以组成一句话,文章是由很多句话组成。元字符也是对一类原子组成的一小段,最终这些元字符汇聚就可以组成正则表达式

3. 量词

量词:描述原子连续出现的次数

3.1 量词的三种写法

等于:原子{n},=n

大于等于:原子{n, },>=n

范围:原子{n, m},n <= 匹配原子 <= m

原子{n}      // 表示要前面紧邻的这个原子要匹配n次
原子{n,}     // 表示要前面紧邻的这个原子要匹配大于等于n次:半开半闭区间 [n, +无穷)
原子{n,m}    // 表示要前面紧邻的这个原子要匹配大于等于n次,小于等于m次:[n, m]

 

3.2 特殊量词

特殊量词

解释

等价于

*

匹配>=0次之前的原子(可存在)

{0,}

+

匹配1次或多次之前的原子(存在)

{1,}

?

匹配0次或1次之前的原子(可有可无)

{0,1}

【举个栗子】/ES\d{4}/    ES0000   ES2018  ES2020

【举个栗子】/go{2,}gle/    gogle    google  goooooogle

【举个栗子】/goo+gle/    gogle    google  goooooogle

/ES\d{4}/     // 可以匹配到:ES000 ES2015 ES2020等
/go{2,}gle/   // 可以匹配到:google gooooooogle等

 

4. 边界控制

边界控制:对匹配目标位置的控制(在多行模式下匹配符合条件的行)

^表示开始,以$表示结束

^:匹配字符串开始的位置

$:匹配字符串结束的位置

/go{2,}gle/   // "This is google website!"  可以匹配

/^go{2,}gle/  // "This is google website!"  匹配失败
              // "google"  可以匹配

此外,边界控制还有模式单元(),小括号的作用可以将整体作为一个原子

[Dd](
  // 2个原子
  D | d
); // 1个原子

5. 修正模式

修正模式:给正则表达式的匹配过程设定一种模式

修正表达式

解释

i

忽略字母大小写

g

执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)

m

 执行多行匹配

【举个栗子】忽略大小写 —— / 正则表达式  /i

【举个栗子】/ES\d/i —— ES5   es5   Es5   eS5

6. 贪婪模式、懒惰模式

贪婪模式:在条件允许的范围内,利益最大化(得寸进尺)  tasssssssshk  s+

懒惰模式:达到最低标准就完事了,懒得动弹(不思进取)  tasssssssshk  s+?

【举个栗子】一共五个手机,你可以选择1-5个,贪婪模式会选择5个,懒惰模式只会选择一个

 

用法:量词后面加表示懒惰模式 

tasssssk   /s+/  匹配结果:sssss  (贪婪模式,可以匹配1个以上的s,那就全匹配)
tasssssk   /s+?/ 匹配结果:s      (懒惰模式,可以匹配1个以上的s,那最低标准1个s)

贪婪模式

懒惰模式

解释

?

??

匹配0个或1个

+

+?

匹配1个或多个

*

*?

匹配0个或多个

{n}

{n}?

匹配n个

{n,m}

{n,m}?

匹配n个或者m个

{n,}

{n,}?

匹配n个或者多个

7. 关于 ?

7.1 (?=) 和 (?!) → 正向断言 和 负向断言

正向断言:(?=原子) 表示后面必须接正向断言的原子,且匹配结果不包括该原子

负向断言:(?!原子)表示后面不能接正向断言的原子,匹配结果不包括该原子

/string(?=s)/   可以匹配:strings (匹配结果:stirng)  不可以匹配:stringS stringa
/string(?!s)/   可以匹配:stringS (匹配结果:string)  不可以匹配:strings

7.2 ?: 可以产生没有编号的分组

正则:/(ab)c(ba)/   /(?:ab)c(ba)/  /((a)(b))(c)/
编号:   1    2               1         1    2

三. 常用正则表达式设计

1. 设计思路

  • 需求分析(匹配11位手机号)
  • 语言描述(1开头、第二位是3,4,5,6,7,8、再接上任意9位数字)
  • 写出正则表达式(上面三个条件得到 —— 1、[345678]、\d{9},拼接后得 /^1[345678]\d{9}$/ 或者 /^1(3|4|5|6|7|8)\d{9}$/)

2. 常用正则表达式

需求

正则表达式

数字

^[0-9]*$

汉字

^[\u4e00-\u9fa5]{0,}$

Email地址

^\w+([-.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

InternetURL

[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

手机号码

^(13[0-9]|14[5|7]|15[0-9]|18[0-9])\d{8}$

身份证号(15位、18位数字)

^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$

IP地址

((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

腾讯QQ号

[1-9][0-9]{4,} (腾讯QQ号从10000开始)

四. JavaScript 正则表达式方法

1. 常见正则表达式方法

方法

返回值

功能

RegExp.test(str: string)

boolean

检测一个字符串是否匹配某个模式

如果字符串中含有匹配的文本,则返回 true,否则返回 false

RegExp.exec(str: string)

string []

检索字符串中的正则表达式的匹配

RegExp.toString()

string

正则表达式的字符串值

String.search()

number

检索指定字符串,返回第一次匹配位置,没找到-1

String.match()

array

检索指定的值,或找到一个或多个正则表达式的匹配

String.replace()

string

检索指定的值并替换

String.split()

array

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

2. regexObj.test(str)

function checkMobile(num) {
  const regRule: RegExp = /^1[3-9]\d{9}$/;
  return regRule.test(String(num));
}

3. str.replace(regexp|substr, newSubStr|function)

$n: 假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始。如果不存在第 n个分组,那么将会把匹配到到内容替换为字面量。比如不存在第3个分组,就会用“$3”替换匹配到的内容

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lyrelion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值