环视正则

一.语法结构 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'

转载于:https://my.oschina.net/Traveller/blog/758778

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值