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