如题所述
第1个回答 2022-06-13
本文介绍的并不是正则表达式的通配符含义,或者一些正则的书写技巧
而是介绍正则匹配的流程,正则进行匹配的规则
例如字符串:abcde
这个时候位置关系如下
分为两种
①是普通匹配,普通匹配占宽度,匹配的是字符
②是断言,断言不占宽度,匹配的是某一个位置,所以断言也被叫做零宽度断言。
例如表达式:/\w(?=\d)/
首先表达式拆解为 \w 与 (?=\d) 两个部分,
表达式 \w 匹配一个字符,占用一个宽度,(?=\d) 表示一个数字的位置
整个正则表达式连接起来就是,首先匹配一个字母或者数字 \w,匹配的这个 \w 后面必须紧跟一个数字 (?=\d)
这里的 \w 为普通匹配,占用宽度,而 (?=\d) 为断言,并不占用宽度,只是规定 \w 后面必须含有一个数字
看一下使用上面这个表达书进行匹配的结果
断言由于不占宽度所以match的结果只有字符'c'
联系第 1 点和第 2 点
例如我们有一个正则表达式,和一个需要进行匹配的字符串
首先对字符串位置做标记,方便我们观察
同样的,我们对正则表达式 /bc/g 进行拆解为 b 与 c 两部分
匹配的过程如下:
①当正则匹配不成功的时候,就会尝试进行回溯
②回溯成功与否取决于是否有可回溯的位置
③若没有会回溯位置,则整个正则表达式匹配失败,控制权交还给表达式的起始位置
④正则规则中使用量词修饰,或者使用|的时候,所匹配的位置为可回溯位置
依旧是一个简单的例子
依旧对正则进行拆解,拆解成 a,b{1,3},b,b,c 五部分
依旧按照之前的规则进行匹配
①正则匹配规则 a, b{1,3}, b, b, c 分别匹配到了字符 a, b, b, b, c
②整个过程中由于 b{1,3} 存在可回溯位置,正则默认匹配规则为贪婪模式,b{1,3} 首先尽可能多的匹配,直到无法继续匹配的时候将控制权移交给下一个匹配字符
③当之后的匹配字符匹配失败的时候,正则表达式尝试从可回溯位置开始进行匹配,如果匹配依旧失败的话,再往前找上一个可回溯位置,直到表达式匹配成功
④如果已经没有任何可回溯位置能满足表达式,则整个表达式匹配失败,它将从上次匹配字符串的开始位置的下一个位置再次尝试匹配
正则默认为贪婪模式,
贪婪模式为尽可能多的匹配,但是非贪婪莫模式不能只解释为尽可能少的匹配
这个时候确实可以理解为尽可能少的匹配
再看一个例子
这个时候如果按照尽可能少的匹配的原则,匹配到的应该是['d1']
所以不能单纯的理解为尽可能少的匹配
表达式拆解为 [a-z]{1,5} 与 1 两部分
而是介绍正则匹配的流程,正则进行匹配的规则
例如字符串:abcde
这个时候位置关系如下
分为两种
①是普通匹配,普通匹配占宽度,匹配的是字符
②是断言,断言不占宽度,匹配的是某一个位置,所以断言也被叫做零宽度断言。
例如表达式:/\w(?=\d)/
首先表达式拆解为 \w 与 (?=\d) 两个部分,
表达式 \w 匹配一个字符,占用一个宽度,(?=\d) 表示一个数字的位置
整个正则表达式连接起来就是,首先匹配一个字母或者数字 \w,匹配的这个 \w 后面必须紧跟一个数字 (?=\d)
这里的 \w 为普通匹配,占用宽度,而 (?=\d) 为断言,并不占用宽度,只是规定 \w 后面必须含有一个数字
看一下使用上面这个表达书进行匹配的结果
断言由于不占宽度所以match的结果只有字符'c'
联系第 1 点和第 2 点
例如我们有一个正则表达式,和一个需要进行匹配的字符串
首先对字符串位置做标记,方便我们观察
同样的,我们对正则表达式 /bc/g 进行拆解为 b 与 c 两部分
匹配的过程如下:
①当正则匹配不成功的时候,就会尝试进行回溯
②回溯成功与否取决于是否有可回溯的位置
③若没有会回溯位置,则整个正则表达式匹配失败,控制权交还给表达式的起始位置
④正则规则中使用量词修饰,或者使用|的时候,所匹配的位置为可回溯位置
依旧是一个简单的例子
依旧对正则进行拆解,拆解成 a,b{1,3},b,b,c 五部分
依旧按照之前的规则进行匹配
①正则匹配规则 a, b{1,3}, b, b, c 分别匹配到了字符 a, b, b, b, c
②整个过程中由于 b{1,3} 存在可回溯位置,正则默认匹配规则为贪婪模式,b{1,3} 首先尽可能多的匹配,直到无法继续匹配的时候将控制权移交给下一个匹配字符
③当之后的匹配字符匹配失败的时候,正则表达式尝试从可回溯位置开始进行匹配,如果匹配依旧失败的话,再往前找上一个可回溯位置,直到表达式匹配成功
④如果已经没有任何可回溯位置能满足表达式,则整个表达式匹配失败,它将从上次匹配字符串的开始位置的下一个位置再次尝试匹配
正则默认为贪婪模式,
贪婪模式为尽可能多的匹配,但是非贪婪莫模式不能只解释为尽可能少的匹配
这个时候确实可以理解为尽可能少的匹配
再看一个例子
这个时候如果按照尽可能少的匹配的原则,匹配到的应该是['d1']
所以不能单纯的理解为尽可能少的匹配
表达式拆解为 [a-z]{1,5} 与 1 两部分