首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

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

2012-03-18 
ruby正则表达式不支持逆序环视?在《精通正则表达式》一书中,作者介绍了如何使用顺序环视和逆序环视在数值中

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"

热点排行