0

在寻找一种在 Ruby 中为大整数添加逗号的方法(例如,更改10000001,000,000)时,我遇到了以下方法:

.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse

它按预期工作,但我不明白做什么(?=\d)和第一个\\\1什么。当我从方法中删除它们时,即:

.to_s.reverse.gsub(/(\d{3})/, '\1,').reverse

该方法仍然有效。如果这些是不必要的,为什么它们在那里?

4

2 回答 2

2

正如您正确观察到的,反斜杠是多余的。您找到的代码不是一个好的代码。你可以删除它。但请确保使用单引号:'\1'. 请注意,解析器不会将此转义解释为转义。它遵循gsub.

(?=\d)确保插入逗号的目标位置后跟(在原始字符串中)另一个数字,这样就100000不会变成",100,000"; 你想要"100,000"

顺便说一句,正如我已经说过的,您找到的代码很糟糕。通常,它是这样完成的:

to_s.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")

在这里,扮演与您的代码(?<=\d)相同的角色。(?=\d)

有关其他方法,请参阅此部分的底部

于 2013-08-11T18:17:32.840 回答
1

(?=\d)是积极前瞻的语法。如果您想匹配某事后跟某事,则积极的前瞻是必不可少的。在这种情况下,您希望匹配 3 个数字后跟另一个数字,以便您可以插入逗号。\1 中的第一个 \ 只是简单地转义了第二个斜杠,因此留下“\1”,这是第一个替换组的语法,在本例中为 d{3},因此它将 d{3} 替换为 d{3 },。

于 2013-08-11T18:08:35.363 回答