| |
|
开发:
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 之间的字母)和特殊字符(称为"元字符") 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等 使用正则表达式的优势
-语法构造正则表达式的方法是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。 组件:单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合 普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号
非打印字符
特殊字符一些有特殊含义的字符,如上面说的
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 ***** 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种
栗子
匹配一个正整数,[1-9]设置第一个数字不是 0,[0-9]* 表示任意多个数字 思考:匹配1~99的正整数表达式 ***和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配 贪婪与非贪婪模式详解定位符定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。 定位符用来描述字符串或单词的边界
注:
选择用圆括号 () 将所有选择项括起来,相邻的选择项之间用 | 分隔。 () 表示捕获分组,() 会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容) 但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用 ?: 放在第一个选项前来消除这种副作用。 其中 ?: 是非捕获元之一,还有两个非捕获元是 ?= 和 ?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串 | (?:pattern) | 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|)来组合一个模式的各个部分是很有用 | ----------- | ------------------------------------------------------------ | ?=、?<=、?!、?<! 的使用区别
反向引用对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。 可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。 应用:提供查找文本中两个相同的相邻单词的匹配项的能力
分析: 捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1 指定第一个子匹配项。 单词边界元字符确保只检测整个单词。否则,诸如 “is issued” 或 “this is” 之类的词组将不能正确地被此表达式识别。 正则表达式后面的全局标记 g 指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。 表达式的结尾处的不区分大小写 i 标记指定不区分大小写。 多行标记指定换行符的两边可能出现潜在的匹配 思考: 将下面的 URI 分解为协议(ftp、http 等等)、域地址和页/路径:答案与解析
-修饰符(标记)用于指定额外的匹配策略 标记不卸载正则表达式里,位于表达式之外,格式如下
-元字符-运算符优先级
-匹配规则模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。 ^,表示该模式只匹配那些以给定模式开头的字符串 $ 符号用来匹配那些以给定模式结尾的字符串 字符 ^ 和 $ 同时使用时,表示精确匹配(字符串与模式一样) 字符簇正则表达式中,通过一对方括号括起来的内容,就称之为“字符簇”,其表示的是一个范围,但是实际匹配时,只能匹配固定的某个字符。 限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配
确定重复出现在更多的情况下,我们可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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永远代表的是真个正则表达式 非捕获组:捕获组存在的副作用:不得不用"()"但并不关系匹配的内容也不会引用捕获到的内容,而记录这些捕获组会占用内存降低匹配效率 因此非捕获组的意义就是为了抵消这种副作用–只进行分组而并不将子表达式匹配到的内容捕获到组里 以 (?) 开头的组是非捕获组,它不捕获文本 也不针对组合计进行计数。 反向引用针对捕获组捕获并分配到组内的内容,每个组将会自动地分配一个组号用于代表该组的表达式,(组号的编制规则见上文👆)而反向引用提供查找重复字符组的方便的方法,它们可被认为是再次匹配同一个字符串的快捷指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 种形式:
如同 ^ 代表开头,$ 代表结尾,\b 代表单词边界一样,先行断言和后行断言也有类似的作用,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为**“零宽”**。所谓位置,是指字符串中(每行)第一个字符的左边、最后一个字符的右边以及相邻字符的中间(假设文字方向是头左尾右) (?=pattern) 正向先行断言 代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配 pattern。 **re(?=gular)**限定了 re 右边的位置,这个位置之后是 gular,但并不消耗 gular 这些字符 (?!pattern) 负向先行断言 类似于(?=pattern)👆 (?<=pattern) 正向后行断言 代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配 pattern 之所以叫后行断言,是因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个扫描字符串中的字符,并判断是否与表达式符合,当在表达式中遇到该断言时,正则表达式引擎需要往字符串前端检测已扫描过的字符,相对于扫描方向是向后的 (?<!pattern) 负向后行断言类似于(?<=pattern)👆 先行与后行正则表达式引擎在执行字符串和表达式匹配时是从前到后连续扫描的。设想有一个扫描指针只想字符边界处并随匹配过程移动。当扫描到先行断言时,引擎尝试匹配指针未扫过的字符,先于指针;后行断言,引擎匹配指针已经扫过的字符,后于指针到达该字符。 正向与反向正向即表示匹配括号中的表达式,负向则不匹配。 Wm-1632059988211)] (?<!pattern) 负向后行断言类似于(?<=pattern)👆 [外链图片转存中…(img-VAvQcatV-1632059988214)] 先行与后行正则表达式引擎在执行字符串和表达式匹配时是从前到后连续扫描的。设想有一个扫描指针只想字符边界处并随匹配过程移动。当扫描到先行断言时,引擎尝试匹配指针未扫过的字符,先于指针;后行断言,引擎匹配指针已经扫过的字符,后于指针到达该字符。 正向与反向正向即表示匹配括号中的表达式,负向则不匹配。 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年12日历 | -2024/12/28 12:52:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |