[英]regular expression in gsub with \1 unexpected behaviour
此示例的行为符合预期:
"cl. 23".gsub(/([0-9]+)/, '|' + '\1'.to_s + '|')
# => "cl. |23|"
但这不是:
"cl. 23".gsub(/([0-9]+)/, '|' + '\1'.to_i.to_s + '|')
# => "cl. |0|"
为什么表达式'\\1'.to_i.to_s
返回"0"
?
为了更加清晰,我的目标是能够使用\\ 1在gsub中使用条件:
"cl. 23".gsub(/([0-9]+)/, '|' + ('\1'.to_i > 36 ? 'g' : 'service' ) + '|')
'\\1'
是"\\\\1"
: \\
+ 1
。
这不是有效的数字表示形式。 (由于领先\\
); String#to_i
对该字符串返回0
。
顺便说一句,如果您想用|
括住数字 ,您不需要to_i
和to_s
。 只需使用|\\1|
作为替换字符串。
"cl. 23".gsub(/([0-9]+)/, '|\1|')
# => "cl. |23|"
在Ruby(或大多数其他编程语言)中,所有参数都在使用它们的方法调用之前进行求值。
在第一个示例中,参数首先被求值,并变为:
gsub(/([0-9]+)/, '|' + '\1'.to_s + '|')
# => gsub(/([0-9]+)/, '|' + '\1' + '|')
# => gsub(/([0-9]+)/, '|\1|')
另一方面,在第二个示例中,参数被求值并变为:
gsub(/([0-9]+)/, '|' + '\1'.to_i.to_s + '|')
# => gsub(/([0-9]+)/, '|' + 0.to_s + '|')
# => gsub(/([0-9]+)/, '|' + '0' + '|')
# => gsub(/([0-9]+)/, '|0|')
同样, 所有参数都在使用它们的方法调用之前进行评估 。 gsub
,如果要让gsub
的替换字符串取决于匹配项,则不能将替换公式放在参数中。 您必须使用一个块。 看起来这是您想要的:
"cl. 23".gsub(/([0-9]+)/){'|' + ($1.to_i > 36 ? 'g' : 'service' ) + '|'}
可行,但实际上并不明智。 更好的方法是
"cl. 23".gsub(/\d+/){|s| "|#{s.to_i > 36 ? "g" : "service"}|"}
似乎您希望在to_i
则表达式匹配的组上调用to_i
方法。 实际上,它是在字符串'\\1'
上调用'\\1'
。
String#to_i
返回0
原因是,如文档所述 :
如果在str的开头没有有效数字,则返回0。
irb> '\1'.to_i
# => 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.