一.语法结构 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}).
二.示例
- "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'