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

Ruby正则表达式模式匹配中的?=和\\1,ruby,Ruby,在寻找在Ruby中向大整数添加逗号的方法(例如,将1000000更改为1000000)时,我遇到了以下方法: 它按预期工作,但我不明白(?=\d)和\\1中的第一个\做什么。当我从方法中删除它们时,即: 这种方法仍然有效。如果这些是不必要的,为什么它们在那里?(?=\d)是正向前瞻的语法。如果你想让某件事跟在另一件事后面,那么积极的前瞻是必不可少的。在这种情况下,您希望匹配3位数字,然后是另一位数字,以便插入逗号。第一个\in\1简单地转义第二个斜杠,这样您就只剩下“\1”,这是第一个替换组的语

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

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


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

(?=\d)
是正向前瞻的语法。如果你想让某件事跟在另一件事后面,那么积极的前瞻是必不可少的。在这种情况下,您希望匹配3位数字,然后是另一位数字,以便插入逗号。第一个\in\1简单地转义第二个斜杠,这样您就只剩下“\1”,这是第一个替换组的语法,在本例中是d{3},所以它用d{3}替换d{3},。

(?=\d)
是正向前瞻的语法。如果你想让某件事跟在另一件事后面,那么积极的前瞻是必不可少的。在这种情况下,您希望匹配3位数字,然后是另一位数字,以便插入逗号。第一个\in\1简单地转义第二个斜杠,这样您就只剩下“\1”,这是第一个替换组的语法,在本例中是d{3},因此它用d{3}替换d{3},正如您正确观察到的,反斜杠是多余的。你找到的代码不是一个好代码。您可以删除它。但请确保使用单引号:
“\1”
。注意,解析器不会将此转义解释为转义。它遵循
gsub
中的特殊语法

(?=\d)
确保插入逗号的目标位置后面(在原始字符串中的前面)有另一个数字,以便
100000
不会变成
”,100000“
;您想要
“100000”

顺便说一下,正如我已经说过的,你找到的代码是一个坏代码。通常是这样做的:

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

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

(?=\d)
确保插入逗号的目标位置后面(在原始字符串中的前面)有另一个数字,以便
100000
不会变成
,100000“
;您需要
“100000”

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

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

到_s.gsub(/(?尝试使用两种方法转换
999
)。转换
999
的结果是后者为
,999
,而前者为正确的
999
(?=\d)
也一样,然后指定仅当替换发生在数字之前时(以相反的形式)?(将
\\1
切换到
\1
没有任何区别。)告诉我,我上面问题的答案是肯定的:
(?=\u pat_u)
-正向前瞻断言:确保以下字符与pat匹配,但不在匹配的文本中包含这些字符。因此
(?=\d)
检查下一个字符是否为数字。尝试使用两种方法转换
999
。使用后者转换
999
的结果是
,999
,而使用前者转换的结果是正确的
999
(?=\d)也是如此
然后指定仅当替换发生在一个数字之前时(以相反的形式)?(将
\\1
切换到
\1
没有任何区别)告诉我上述问题的答案是肯定的:
(?=\u pat\u)
-正向先行断言:确保以下字符与pat匹配,但不在匹配的文本中包含这些字符。因此
(?=\d)
检查下一个字符是否是数字。可能代码来自Ruby版本,即使没有查找,也有比找到的OP更好的方法。可能代码来自Ruby版本,即使没有查找,也有比找到的OP更好的方法。我唯一剩下的问题是为什么正则表达式使用或不使用第一个斜杠?如果它需要转义,当它缺少转义时不应该有错误吗?@user1652620如果用双引号括起来,它需要转义。在单引号中,大多数反斜杠(即,除非它们转义反斜杠或引号)被视为文本。我唯一剩下的问题是为什么正则表达式使用或不使用第一个斜杠?如果它需要转义,当它缺少转义时不应该有错误吗?@user1652620如果用双引号括起来,它需要转义。在单引号中,大多数反斜杠(即,除非它们转义反斜杠或引号)被视为文字。
to_s.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")