繁体   English   中英

gsub中具有\\ 1意外行为的正则表达式

[英]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_ito_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.

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