IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 正则表达式 -> 正文阅读

[JavaScript知识库]正则表达式

正则表达式

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等

使用正则表达式的优势

  • 测试字符串内的模式
    例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证
  • 替换文本
    可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它
  • 基于模式匹配从字符串中提取子字符串
    可以查找文档内或输入域内特定的文本

-语法

构造正则表达式的方法是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。

组件:单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合

普通字符

包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号

字符描述
[ABC]匹配[……]中的所有字符image-20210919215345079
[^ABC]匹配除了[……]中字符的所有字符image-20210919215422493
[A-Z]-表示一个区间,匹配所有大写字母 image-20210919215442535
.匹配除换行符(\n、\r)之外的任何单个字符,等价于[^\n \r]image-20210919215514061
[\s\S]匹配所有 \s是匹配所有空白字符包括换行 \S非空白符,不包括换行image-20210919215625285
\w匹配数字、字母、下划线 等价于[a-zA-Z0-9]!image-20210919215728032
\d匹配数字

非打印字符

字符含义
\cx匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符
\f匹配一个换页符。等价于 \x0c 和 \cL
\n匹配一个换行符。等价于 \x0a 和 \cJ
\r匹配一个回车符。等价于 \x0d 和 \cM
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
\S匹配任何非空白字符。等价于 [^ \f\n\f\t\v]
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。[\w]+,\w+,[\w+] 三者区别

特殊字符

一些有特殊含义的字符,如上面说的runoo\*b中的*,简单的说就是表示任何字符串的意思,如果要查找字符串中德特殊字符,就需要对他们进行转义,即在其前加一个\

特殊字符描述
$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 $
()标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )
*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *
+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +
.匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 .
[标记一个中括号表达式的开始。要匹配 [,请使用 [
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?
\将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”
^匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 ^
{标记限定符表达式的开始。要匹配 {,请使用 {
|指明两项之间的一个选择。要匹配|,请使用|

限定符

用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 ***** 或 +?{n}{n,}{n,m} 共6种

字符描述
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}
?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o
{n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格

栗子

/[1-9][0-9]*/
//限定符出现在符号表达式之后,应用于整个范围表达式

匹配一个正整数,[1-9]设置第一个数字不是 0,[0-9]* 表示任意多个数字

img

思考:匹配1~99的正整数表达式

***+ 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配

贪婪与非贪婪模式详解

贪婪与非贪婪模式·例子

定位符

定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。

定位符用来描述字符串或单词的边界

字符描述
^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配
$匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配
\b匹配一个单词边界,即字与空格间的位置
\B非单词边界匹配

  • 不能将限定符与定位符一起使用(在紧靠换行或者单词边界的前面或后面不能有一个以上位置)
  • 若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。
  • 若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符。

选择

用圆括号 () 将所有选择项括起来,相邻的选择项之间用 | 分隔。

() 表示捕获分组,() 会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容)

img img

但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用 ?: 放在第一个选项前来消除这种副作用。

其中 ?: 是非捕获元之一,还有两个非捕获元是 ?=?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串

| (?:pattern) | 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|)来组合一个模式的各个部分是很有用在这里插入图片描述

| ----------- | ------------------------------------------------------------ |

?=、?<=、?!、?<! 的使用区别
  1. exp1(?=exp2):查找 exp2 前面的 exp1
img
  1. (?<=exp2)exp1:查找 exp2 后面的 exp1。

img

  1. exp1(?!exp2):查找后面不是 exp2 的 exp1

img

  1. (?<!exp2)exp1:查找前面不是 exp2 的 exp1

img

反向引用

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数

可以使用非捕获元字符 ?:?=?! 来重写捕获,忽略对相关匹配的保存。

应用:提供查找文本中两个相同的相邻单词的匹配项的能力

var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;
document.write(str.match(patt1));

分析:

捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1 指定第一个子匹配项。

单词边界元字符确保只检测整个单词。否则,诸如 “is issued” 或 “this is” 之类的词组将不能正确地被此表达式识别。

正则表达式后面的全局标记 g 指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。

表达式的结尾处的不区分大小写 i 标记指定不区分大小写。

多行标记指定换行符的两边可能出现潜在的匹配

思考

将下面的 URI 分解为协议(ftp、http 等等)、域地址和页/路径:答案与解析

http://www.runoob.com:80/html/html-tutorial.html

-修饰符(标记)

用于指定额外的匹配策略

标记不卸载正则表达式里,位于表达式之外,格式如下

/pattern/flags
常用修饰符含义描述
iignore-不区分大小写将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别
gglobal-全局匹配查找所有的匹配项
mmulti line-多行匹配使边界字符 ^$ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾 g只匹配第一行添加m之后实现多行img
s特殊字符圆点**.**中包含换行符\n默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \nimg

-元字符

-运算符优先级

运算符描述
转义符
圆括号和方括号
限定符
定位点和序列(位置和顺序)
替换,“或”操作
字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"

-匹配规则

模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。

^,表示该模式只匹配那些以给定模式开头的字符串

$ 符号用来匹配那些以给定模式结尾的字符串

字符 ^$ 同时使用时,表示精确匹配(字符串与模式一样)

字符簇

则表达式中,通过一对方括号括起来的内容,就称之为“字符簇”,其表示的是一个范围,但是实际匹配时,只能匹配固定的某个字符。 限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配

[a-z] // 匹配所有的小写字母 
[A-Z] // 匹配所有的大写字母 
[a-zA-Z] // 匹配所有的字母 
[0-9] // 匹配所有的数字 
[0-9\.\-] // 匹配所有的数字,句号和减号 
[ \f\r\t\n] // 匹配所有的白字符
//栗子
[^a-z] //排除小写自目以外的所有字母
^[^0-9][0-9]$ //第一个字符不能是数字

确定重复出现

在更多的情况下,我们可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数

^[[:alpha:]]{3}$  //所有的3个字母的单词
^a{2,4}$  //aa,aaa或aaaa
^a{2,}$  //包含多于两个a的字符串
.{2}  //所有的两个字符
\t{2}  //两个制表符
   
^[a-zA-Z0-9_]{1,}$      // 所有包含一个以上的字母、数字或下划线的字符串 
^[1-9][0-9]{0,}$        // 所有的正整数 
^\-{0,1}[0-9]{1,}$      // 所有的整数 
^[-]?[0-9]+\.?[0-9]+$   // 所有的浮点数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mobh7x2h-1632059988206)(C:\Users\86153\AppData\Roaming\Typora\typora-user-images\image-20210919172542793.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N98dINxc-1632059988206)(C:\Users\86153\AppData\Roaming\Typora\typora-user-images\image-20210919172831093.png)]

特殊字符 ?{0,1} 是相等的,它们都代表着: 0个或1个前面的内容前面的内容是可选的

特殊字符 ***** 与 {0,} 是相等的,它们都代表着 0 个或多个前面的内容

特殊字符 +{1,} 是相等的,表示 1 个或多个前面的内容

一些示例

捕获(capture group)和反向引用

分组–() 分组后()里的内容会被当作一个整体来处理

捕获组:

把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用–反向引用(正则表达式内部或外部)。

一旦使用了“()"就会默认是捕获组并将()表达式匹配的内容捕获。

编号规则:从左往右以分组的左括号为标志,第一个出现的分组组号为1,以此类推。注:组0永远代表的是真个正则表达式

非捕获组:

捕获组存在的副作用:不得不用"()"但并不关系匹配的内容也不会引用捕获到的内容,而记录这些捕获组会占用内存降低匹配效率

因此非捕获组的意义就是为了抵消这种副作用–只进行分组而并不将子表达式匹配到的内容捕获到组里

以 (?) 开头的组是非捕获组,它不捕获文本 也不针对组合计进行计数。

反向引用

针对捕获组捕获并分配到组内的内容,每个组将会自动地分配一个组号用于代表该组的表达式,(组号的编制规则见上文👆)而反向引用提供查找重复字符组的方便的方法,它们可被认为是再次匹配同一个字符串的快捷指令

(boy)\1          //相当于(boy)(boy),匹配boyboy
(boy)(girl)\1\2  //匹配boygirlboygirl
//对比(\w)\1和的区别:
(\w)\1    //该正则匹配的是出现两次的字符,\1将重复匹配(\w)出现的内容!例如匹配aa、bb
(\w)(\w)  //该正则只是简单的匹配两个字符,例如匹配ab,aa等。注意区别!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nZbB3zOv-1632059988207)(C:\Users\86153\AppData\Roaming\Typora\typora-user-images\image-20210919201413284.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RZTSCn1x-1632059988208)(C:\Users\86153\AppData\Roaming\Typora\typora-user-images\image-20210919201437714.png)]

先行断言(lookahead)和后行断言(loodbehind)

正则表达式的先行断言和后行断言一共有 4 种形式:

  • (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)
  • (?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)
  • (?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion)
  • (?<!pattern) 零宽负向后行断言(zero-width negative lookbehind assertion)

如同 ^ 代表开头,$ 代表结尾,\b 代表单词边界一样,先行断言和后行断言也有类似的作用,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为**“零宽”**。所谓位置,是指字符串中(每行)第一个字符的左边、最后一个字符的右边以及相邻字符的中间(假设文字方向是头左尾右)

(?=pattern) 正向先行断言 代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配 pattern。

**re(?=gular)**限定了 re 右边的位置,这个位置之后是 gular,但并不消耗 gular 这些字符

img

(?!pattern) 负向先行断言 类似于(?=pattern)👆

img

(?<=pattern) 正向后行断言 代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配 pattern

之所以叫后行断言,是因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个扫描字符串中的字符,并判断是否与表达式符合,当在表达式中遇到该断言时,正则表达式引擎需要往字符串前端检测已扫描过的字符,相对于扫描方向是向后的

img

(?<!pattern) 负向后行断言类似于(?<=pattern)👆

img

先行与后行

正则表达式引擎在执行字符串和表达式匹配时是从前到后连续扫描的。设想有一个扫描指针只想字符边界处并随匹配过程移动。当扫描到先行断言时,引擎尝试匹配指针未扫过的字符,先于指针;后行断言,引擎匹配指针已经扫过的字符,后于指针到达该字符。

正向与反向

正向即表示匹配括号中的表达式,负向则不匹配。

更多理解

Wm-1632059988211)]

(?<!pattern) 负向后行断言类似于(?<=pattern)👆

[外链图片转存中…(img-VAvQcatV-1632059988214)]

先行与后行

正则表达式引擎在执行字符串和表达式匹配时是从前到后连续扫描的。设想有一个扫描指针只想字符边界处并随匹配过程移动。当扫描到先行断言时,引擎尝试匹配指针未扫过的字符,先于指针;后行断言,引擎匹配指针已经扫过的字符,后于指针到达该字符。

正向与反向

正向即表示匹配括号中的表达式,负向则不匹配。

更多理解

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:42:12  更:2021-09-20 15:42:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:36:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码