首先明确一下什么是匹配
匹配可以从两个方面来理解
1 一个正则表达式和一个字符串是否匹配
在perl中 =~ 代表捆绑 也就是让正则表达式去匹配指定的字符串
如果如果用匹配的符号形式来表现 对于 /regular/ =~ "string" 如果返回值为真 则说/regular/ 匹配了"string"
2 一个正则表达式不只可以匹配一个字符串
例如 /a*b/ 不仅可以匹配aaaab 还可以匹配aaaaaab b 等
这里所谓的“匹配”也是指 /a*b/ =~ aaaab /a*b/ =~ b 返回值都是真
下面说说依次匹配
首先的一个问题是一个正则表达式的工作过程
举个例子
代码: |
$data is 192.168.0.1 $data =~ /([0-9]*\.)([0-9]*.)([0-9]*\.)([0-9])/; is 192. is 168. is 0. is 1 这里 /([0-9]*\.)([0-9]*\.)([0-9]*\.)([0-9])/ 匹配了192.168.0.1 同时在这个较长的正则表达式子是由几个短的正则表达式组成的,这些短的在()中的正则表达式称为模式,大家对,,,的值的输出都非常理解 |
代码: |
$data =~ /([0-9]*\.)([0-9]*\.)*([0-9])/; is 192. is 0. is 1 |
3x3eyes 写到: |
....匹配.168都还好理解所谓的依次匹配是什么意思,请各位帮忙 |
代码: |
$data =~ /([0-9]*\.)([0-9]*\.)([0-9])/; is 192. is 168. is 0 |
代码: |
对于 $data =~ /([0-9]*\.)([0-9]*\.)([0-9])/; 这时候对于模式1 模式2 模式3 他们没有机会选择 分别将各自匹配的 192. 168. 0 存在正则表达式的记忆体 中 而对于 $data =~ /([0-9]*\.)([0-9]*\.)*([0-9])/; 对于模式1 从左到右搜索$data 匹配了192. 把它存在了记忆体 中 对于模式2 从左到右搜索剩下的$data 部分 匹配了 168. 并把它存在了记忆体中 下面到了* 这里*代表 前面模式的0次或多次出现 虽然在功能上对于这个例子它等于([0-9]*\.)([0-9]*\.)([0-9]*\.)([0-9])/, 但是它并不等价于正则表达式/([0-9]*\.)([0-9]*\.)([0-9]*\.)([0-9])/ 。这时候仍然是模式2 去从左到右搜索$data剩余的字符串0.1 结果匹配了0. 由于仍然是模式2去匹配,所以0. 仍然存在记忆体中,冲掉了原来存在记忆体中的内容 下面([0-9]) 匹配了1 并把它存在了记忆体中。 |
代码: |
1 如果在正则表达式中有模式 ,那么每个模式从左到右搜索要匹配的字符串,如果匹配成功,则把匹配的字符串存到相对应的记忆体中。 2 如果正则表达式中有下一个模式,那么这个模式将继续从左到右搜索没有被匹配的字符串 ,重复前面的步骤1的过程,匹配成功则立即停止,并把匹配的字符串存到相应的记忆体中。 3 如果在2中的模式后面出现了数量符* + ? ,形如:(模式2)*,则匹配过程变为:模式2仍然按照步骤1的过程匹配,匹配成功则停止。但是由于这时候在模式2后面出现了数量符 * ,则仍然由模式2去匹配字符串中没有被匹配的的部分,如果这时候出现了可以匹配多个字符串的情况,那么作后一次匹配成功的字符串被存放到了模式2对应的记忆体中(注意:中间匹配成功的并不是没有存,而是被后面匹配成功的覆盖了)。 |
代码: |
$data = 192.168.0.1 $data =~ /([0-9]*\.)([0-9]*\.)*([0-9]*\.)([0-9]*.)([0-9])/ 按照上面的结论,大家不妨猜测一下的内容 ,也就是记忆体2中的值是什么 在没有看到答案之前,也许会有人猜测是0. 或者168.。 但是这里 的值是空值,*在这里是“0个”。 |