繁体   English   中英

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

[英]?= and \\1 in Ruby regular-expression pattern matching

在寻找一种在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)相同。

对于其他的方式来做到这一点,看到的底部

(?=\\d)是正向超前的语法。 如果要匹配某些内容,然后再匹配其他内容,则积极的前瞻不可或缺。 在这种情况下,您要匹配3位数字,然后再匹配另一位数字,以便可以插入逗号。 \\ 1中的第一个\\只是转义了第二个斜杠,因此您留下的是“ \\ 1”,这是第一个替换组的语法,在这种情况下为d {3},因此它将d {3}替换为d {3 }.。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM