正则补充

之前PHP笔记里的正则表达式部分略有不足(致命缺陷[滑稽]),在此进行一些补充,分为19点,当做备忘。主要来源于《正则表达式30分钟入门教程》,可以到http://deerchao.net/tutorials/regex/regex.htm查阅详细内容。

  1. \b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w
  2. \d匹配一个数字
  3. \w匹配字母或数字或汉字或下划线
  4. {n,}重复n次或更多。{n,m}重复n到m次
  5. 分支条件|,注意各条件顺序。匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。所以要把匹配较长、成立难度大的放在前面。如:\d{5}|\d{5}-\d{4}只会匹配前五个数字。
  6. 反义。大写与小写反义,如\b与\B,\w与\W。另:[^x]匹配除x以外的任意字符[^dsafl]匹配除dsafl外的任意字符。例:<a[^>]+>匹配用尖括号括起来的以a开头的字符串。
  7. 向后引用。每个分组()会自动分配组号,0表示整个表达式,1表示第一个(),以此类推。例:\b(\w+)\b\s+\1\b可匹配重复的单词。
  8. 指定表达式组名。语法:(?\w+)或(?‘Word’\w+),反向引用这个分组捕获的内容,可用\k。例:\b(?\w+)\b\s+\k\b可匹配重复的单词。
  9. (?:exp)匹配,但不捕获,也不分配组号。(?#comment)注释,不产生任何影响。
  10. 零宽度正预测先行断言:(?=exp)断言自身出现的位置的后面能匹配表达式exp。例:\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分)。
  11. 零宽度正回顾后发断言:(?<=exp)断言自身出现的位置的前面能匹配表达式exp。例:(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分)。
  12. 注意:零宽断言只匹配一个位置,不消费任何字符!假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890。
  13. 零宽度负预测先行断言:(?!exp)断言此位置的后面不能匹配表达式exp。例:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字。
  14. 零宽度负回顾后发断言:(?<!exp)断言此位置的前面不能匹配表达式exp。例:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
  15. 一个更能体现零宽断言真正用途的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容。(?<=<(\w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是),然后是.*(任意的字符串),最后是一个后缀(?=<\/\1>)。注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是的话,后缀就是了。整个表达式匹配的是之间的内容(再次提醒,不包括前缀和后缀本身)。
  16. 零宽断言的个人总结:“零宽”表示只匹配位置,不消费字符;“正”表示存在,用“=”,“负”表示不存在用“!”;“预测先行”看后面,“回顾后发”看前面,用”<”。
  17. 默认贪婪匹配。在次数标识符后面加“?”表示懒惰匹配。贪婪匹配尽量多的字符,懒惰匹配尽量少
  18. 注意:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。此原则高于贪婪/懒惰规则。
  19. 关于平衡组和递归匹配,只能勉强看懂,根本不会用,放一个例子就溜了。例:匹配嵌套的
    标签:<div[^>]*>[^<>]*(((?’Open’<div[^>]*>)[^<>]*)+((?’-Open’
    )[^<>]*)+)*(?(Open)(?!))。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
,