正则表达式学习-进

说一点题外话,进阶果然不是那么容易的,光是在零度断言那里就停留了好长时间,
 然后在自己写例子的时候也耽误了不少时间,不过好在也弄懂了不少东西,对正则
表达式的掌握也更深了一步。
若有好的意见或建议,请给我留言。
-------------------------------------------------------------------------------------
    分组
                                                                                  
    分组简单,说不好说,写一个简单的例子吧: �(/d{1,3}/.){3}/d{1,3},匹配IP地址,首先说明,这个肯定
 是不规范,不过这里就是一个说明,我们按顺序解析它,/d{1,3}匹配1到3位
的数字,后面加{3}匹配三位数字加上. 重复三次,最后再加上一个1到3位的数字,这就是分组,
 就这么简单。
                                                                                   
 后向引用
                                                                                   
    根据我的理解就是如果使用一个小括号指定一个表达式,如(/d{1,3}),它就自动拥有了一个组号,从左到右
,以分组的左括号为标志,分组的组号依此为1,2,3,...,后向引用就是用于
 重复搜索前面某个分组(小括号中的表达式)匹配的文本。例如,/1代表分组1匹配的文本,难
以理解?恩,是有点难以理解,我刚开始也一样,不要急,我们看一个例子:
 /b(/w+)/b/s+/1/b 可以用来匹配重复的单词,如kitty kitty之类。首先是一个单词,然后是
 1个或多个空白符,最后是前面匹配的那个单词(/1).
     我们也可以自己指定子表达式的组名。语法: (?<Word>/w+)(或者把<>用''替换),这样,
/w+该组的组名指定为了Word,要反向引用这个分组可以这样使用/k<Word>,所以上一个例子
 也可以这样写: /b(?<Word>/w+)/b/s+/k<Word>/b。
                                                                                  
   (exp)  匹配exp,并捕获文本到自动命名的组里
   (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可写成 (?'name'exp)
  (?:exp) 匹配exp,不捕获匹配的文本,也不给该分组分配组号
                                                                                   
零宽断言
                                                                                   
   (?=exp) 匹配exp前面的位置
   (?<=exp)匹配exp后面的位置
  (?!exp) 匹配后面根的不是exp的位置
   (?<!exp)匹配前面不是exp的位置
                                                                                   
   这个我简单说一下,但可能说不太明白,一会大家看例子。其实也容易懂,关键是它的
名字太拗了,让人觉得很难,简单的说,它们也是象/b,^,$那样用于指定一个位置,不
 同的是在这里的这个位置需要满足exp这个条件(即所说的断言),举例说明:
  /b/w+(?=ing/b), 匹配以ing结尾的单词的前面部分(除ing以外),如串: I'm singing
 while you're dancing. 它会匹配sing和danc。
   (?<=/bre)/w+/b, 匹配以re开头的单词的后半部分(除re以外),如串: reading a book.
 它会匹配ading。 ((?<=/d)/d{3})*/b,对1234567890查找时结果为234567890。
   (?<=/s)/d+(?=/s), 匹配以空白符间隔的数字。
                                                                                  
   /d{3}(?!/d), 匹配3位数字,且这3位数字后面不是是数字。 /b((?!abc)/w)+/b, 匹配
不包含连续字符串abc的单词。
   (?<![a-z])/d{7}, 匹配前面不是小写字母的7位数字。
  (?<=<(/w+)>).*(?=<///1>), 匹配不包含属性的简单HTML标签内里的内容。(<?(/w+)>)
 指定了前缀:被<>括起来的单词(如<b>),然后是.*任意字符串,最后是一个后缀(?=<///1>).
 /1是一反向引用,引用的是捕获的第一组,即(/w+)的匹配的内容,这样如果前缀是<b>的话,
后缀就是</b>了。整个表达式匹配的就是<b>和</b>之间的内容.
                                                                                  
 断言现在应该容易明白了吧。可就在我自以为明白了后,准备写一个能够匹配HTML标签内
 容的表达式,可参考上面的表达式写出来后可怎么也运行不出来,以为是自己写错了,可
找了半天也没找出原因来,后来问了高手才知道: 在php正则表达式中若使用断言,则不能
出现象.,*,+之类的模糊性质的符号,否则就会编译出错,要使用就具体写出来要匹配的
标签吧。不过在我的测试过程中,建议要获得标签内的内容,还是不要使用断言的好,累
 死人了,就是普通的就可以,如: <font[^>]*>(.*?)<//font>.
                                                                                                                                                                   
贪婪与懒惰
                                                                                   
这里比较简单,记住一句话:最先开始的匹配具有最大的优先权,它比懒惰/贪婪规则优先
级更高。
                                                                                   
  *?  重复任意次,但尽可能少重复
  +?  重复1次或多次,但尽可能少重复
  ??  重复0次或1次,但尽可能少重复
   {n,m}? 重复n到m次,但尽可能少重复
   {n,}? 重复n次以上,但尽可能少重复
 
今天看得太累了,就写这么多了,希望能够对大家有所帮助,其余的等下次再继续吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值