ruby正则表达式不支持逆序环视?该怎么解决

在《精通正则表达式》一书中,作者介绍了如何使用顺序环视和逆序环视在数值中插入逗号:

Perl:
$Longnumber=~s/(?<=\d)(?=(\d\d\d)+(?!\d))/,/g;

我试把它改写成Ruby:
Longnumber.gsub(/(?<=\d)(?=(\d\d\d)+(?!\d))/, ',')

按了一下回车,错误信息提示:
undefined (?...) sequence: /(?<=\d)(?=(\d\d\d)+(?!\d))/

然后我查找Ruby文档,发现只有顺序环视 (?=re) (?!re)
还有一个不知道其用法的(?>re)

不知道Ruby是否支持逆序环视(?<=...)或者不用逆序环视就可以在数值中插入逗号。


[解决办法]
用逗号将数字划分成3位一组的形式

*

方法1:使用回行和先行的方法(回行(lookbehind)需要Oniguruma库的支持)

p "tone of 12345Hz".gsub(/(?<=\d)(?=(?:\d\d\d)+(?!\d))/, ',')
=> ruby 1.8.0 (2003-08-07) [i586-linux]
"tone of 12,345Hz"

*

方法2:只使用先行的方法

p "tone of 12345Hz".gsub(/(\d)(?=(?:\d\d\d)+(?!\d))/, '\1,')
=> ruby 1.8.0 (2003-08-07) [i586-linux]
"tone of 12,345Hz"

*

方法3:不使用先行的方法

s = "tone of 12345Hz"
nil while s.gsub!(/(.*\d)(\d\d\d)/, '\1,\2')
p s
=> ruby 1.8.0 (2003-08-07) [i586-linux]
"tone of 12,345 Hz"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值