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"