环视正则

蓝咒 提交于 2019-12-17 12:33:21

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

一.语法结构 1.环视结构不匹配任何字符,只匹配文本中的特定位置.也有人称之为零宽断言.

2.环视的特点 <1> 不会"占用"任何文本,只匹配一个"位置". <2> 只是简单的测试: 能够在当前位置匹配后面(右侧)的文本(顺序),或者能够在当前位置匹配前面(左侧)的文本(逆序).

3.环视类型及表达式

(?=…)          顺序肯定环视,从左至右,子表达式能够匹配右侧文本.
(?!…)          顺序否定环视,从左至右,子表达式不能匹配右侧文本.
(?<=…)         逆序肯定环视,从右至左,子表达式能够匹配左侧文本.
(?<!…)         逆序否定环视,从右至左,子表达式不能匹配左侧文本.

3.限制

 多数实现方式都限制了逆序环视中的表达式长度;而顺序环视则没有限制.

 第一级;Perl和Python的限制是最严格的,逆序环视只能匹配固定长度的文本,也就是说逆序环视中不能使用量词(*、?、+、{m,n}).例如(?<!books?)就是不合法的,不过在某些情况下可以重写为(?<book)(?<!books).

 第二级;PCRE(因为包括php)支持在逆序环视中出现多选分支,所以可以写为"(?<!book|books)".同样不能使用量词(?、*、+、{m,n}).

 第三级;sun的Java regex package支持匹配任意长度的文本,但是其长度不能为无限.也就是说"(?<!books?)"是允许的,但是"(?<books+)"则不合法. 换言之,量词"?"和"{m,n}"可以使用,而量词"*"和"+"则不能使用.

 第四级;.NET支持容许逆序环视中的子表达式匹配任意长度的的文本.甚至包括(?<!boos+).但是要注意,如果使用不当会带来很严重的效率问题.换言之,允许使用量词(?、*、+、{m,n}).

二.示例

  1. "The US population is 29 844 4215 "将其中的数字部分改为"298,444,215".
echo "The US population is 298444215"|perl -aple 's/(?<=\d)(?=(\d\d\d)+$)/,/g'
echo "The US population of 298444215 is groing"|perl -aple 's/(?<=\d)(?=(\d\d\d)+(?!\d))/,/g'
echo "The US population of 298444215 is groing"|perl -aple 's/(\d)(?=(\d\d\d)+(?!\d))/$1,/g'
echo "The US population of 298444215 is groing"|perl -aple 's/(\d{3})(?=\d)/$1,/g'
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!