在寻找一种在Ruby中向大整数添加逗号的方法(例如,将1000000
更改为1,000,000
)时,我遇到了以下方法:
.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
它按预期工作,但我不明白(?=\d)
和\
中的第一个\\1
是做什么的。当我从方法中删除它们时,即:
.to_s.reverse.gsub(/(\d{3})/, '\1,').reverse
该方法仍然奏效。如果这些是不必要的,为什么他们在那里?
答案 0 :(得分:2)
正如您所正确观察到的,反斜杠是多余的。你找到的代码不是很好。你可以删除它。但请务必使用单引号:'\1'
。请注意,解析器不会将此转义解释为转义。它遵循gsub
中的特殊语法。
(?=\d)
确保插入逗号的目标位置(在原始字符串之前)跟随另一位数,以便100000
不会变为",100,000"
;你想要"100,000"
。
顺便说一下,正如我已经说过的那样,你发现的代码很糟糕。通常,它是这样做的:
to_s.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")
此处,(?<=\d)
在您的代码中扮演与(?=\d)
相同的角色。
有关其他方法,请参阅this的底部。
答案 1 :(得分:1)
(?=\d)
是正向前瞻的语法。如果你想要匹配其他东西,那么积极的前瞻是必不可少的。在这种情况下,您希望匹配3个数字后跟另一个数字,以便您可以插入逗号。第一个\ in \ 1只是转义第二个斜杠,因此你留下“\ 1”这是第一个替换组的语法,在本例中是d {3},所以它用d {3}替换d {3} },