正则表达式的深度应用

一、转义
\n 换行 (十六进制 0A) 
\p{xx} 一个符合 xx 属性的字符,详细查看unicode properties 属性 
\P{xx} 一个不符合xx属性的字符,详细查看unicode properties 属性 
\r 回车 (十六进制 0D) 
\t 水平制表符 (十六进制 09) 
\xhh hh十六进制编码的字符,详细查看unicode properties 属性 

\d 任意十进制数字
\D 任意非十进制数字
\h 任意水平空白字符(since PHP 5.2.4)
\H 任意非水平空白字符(since PHP 5.2.4)
\s 任意空白字符
\S 任意非空白字符
\v 任意垂直空白字符(since PHP 5.2.4)
\V 任意非垂直空白字符(since PHP 5.2.4)
\w 任意单词字符
\W 任意非单词字符

二、防止贪婪型匹配(懒惰匹配)

贪婪型元字符懒惰型元字符
*   *?
++?
{n,} {n,}?

三、边界

单词边界 \b
例:\bcat\b
字符串边界 ^ $

四、反向引用
在一个字符类外面, 反斜线(Js使用$)紧跟一个大于 0 (可能还有一位数)的数字就是一个到模式中之前出现的某个捕获组的反向引用。

例:[  ](\w+)[  ]\1  
 \1 代表前面子表达式搜索的结果;
 [  ] 代表空格。 

<h[1-6]>.*<h[1-6]> 错误
<h([1-6])>.*?<h\1> 正确 .*?(懒惰) \1 反向引用

五、断言(向前查找、向后查找)
简单的断言就是位置匹配,如\b、\B、 \A、 \Z、\z、 ^、$ 等。
断言就是一个对当前匹配位置之前或之后的字符的测试, 向前查找而不再匹配结果中返回。

复杂的断言以子组的方式编码。 
它有两种类型: 前瞻断言(从当前位置向前测试)和后瞻断言(从当前位置向后测试)。 
前瞻断言中的(a)正面断言(断言此匹配为真)以 "(?=" 开始;(b)消极断言以 "(?!" 开头。
后瞻断言中的(a)正面断言以"(?<="开始;(b)消极断言以"(?<!"开始。
例: 
\w+(?=;) 匹配一个单词紧跟着一个分号但是匹配结果不会包含分号;

foo(?!bar) 匹配所有后面没有紧跟 "bar" 的 "foo" 字符串。
—————————————————————————————————————————————————————— 

注意一个类似的模式 (?!foo)bar, 它不能用于查找之前出现所有不是 "foo" 的 "bar" 匹配, 它会查找到任意的 "bar" 出现的情况, 因为 (?!foo) 这个断言在接下来三个字符时 "bar" 的时候是永远都 TRUE 的。 前瞻断言需要达到的就是这样的效果。

后瞻断言比如, 
(?<!foo)bar 用于查找任何前面不是 "foo" 的 "bar"。 
后瞻断言的内容被严格限制为只能用于匹配定长字符串。但是,如果有多个可选分支, 它们不需要拥有相同的长度。
比如 (?<=bullock|donkey) 是允许的, 但是 (?<!dogs?|cats?) 将会引发一个编译期的错误。

六、条件子组
题目:
123-456-7890       T
(123)456-7890      T
1234567890          F
(123)-456-7890     F
(123-456-7890)     F
123 456 7890        F

根据一个断言的结果或者之前的一个捕获子组是否匹配,作为条件来选择匹配一个子组或者另一可选子组。
(?(condition)yes-pattern)
(?(condition)yes-pattern|no-pattern)

条件一共有两种。
如果在(condition)的括号内是数字组成的文本, 条件在该数字代表的(之前的)子组得到匹配时满足(即使用 yes-pattern)。
例:(?(1) ... ... ) 
考虑下面的模式, 为了使其易于阅读其中增加了一些空白字符(查看PCRE_EXTENDED 选项)并且将其分为三个部分: ( \( )? [^()]+ (?(1) \) )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值