Ruby正则表达式模式匹配中的?=和\\ 1

时间:2013-08-11 17:57:54

标签: ruby

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

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

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

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

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

2 个答案:

答案 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} },