【发布时间】:2020-08-26 09:11:02
【问题描述】:
我是 ruby 新手,请原谅我的无知 :)
我刚刚了解了eval,并了解了它的阴暗面。
到目前为止我读到的:
所以我要做的是读取一个文件,其中有一些文本,例如/e/ 3,在评估后将用3 替换每个e。
所以到目前为止我做了什么:(工作但是..)
def evaluate_lines
result="elt"
IO.foreach("test.txt") do |reg|
reg=reg.chomp.delete(' ')
puts reg
result=result.gsub(eval(reg[0..2]),"#{reg[3..reg.length]}" )
p result
end
end
test.txt 文件的内容
/e/ 3
/l/ 1
/t/ 7
/$/ !
/$/ !!
这只是因为我知道文件中行的长度。
所以假设我的文件具有以下 /a-z/ 3 我的程序将无法执行预期的操作。
注意
我尝试使用Regexp.new reg,结果出现以下/\/e\/3/,这在这种情况下不是很有帮助。
`Regexp 的简单示例
str="/e/3"
result="elt"
result=result.gsub(Regexp.new str)
p result #outputs: #<Enumerator: "elt":gsub(/\/e\/3/)>
我已经尝试去除斜线,但即使这不会提供所需的结果,因此 gsub() 需要两个参数,例如 gsub(/e/, "3")。
关于正则表达式的用法,我已经看过Convert a string to regular expression ruby
【问题讨论】:
-
当你有
Regex.new时,你不需要eval。我也远离命名您的输入文件.rb,因为它肯定不是 Ruby 代码。要使其与Regexp.new一起使用,请先去掉前导斜杠和尾随斜杠。 -
@tadman,对不起,我输入的是 rb 而不是 txt 抱歉。我编辑了帖子。无论如何,使用 regexp.new 没有帮助,因此我会给我不想要的结果,因为方法
gsub需要两个参数,例如gsub(/e/, "3") -
您可以控制输入文件的格式吗?如果是这样,你可以让你的生活轻松一百倍。
-
好吧,虽然我可以完全控制这个文件,但格式是由分配者提供的。并且this 不在桌面上,因此 test.txt 在测试时可能会更大:)。即使我可以去掉反斜杠,我也必须将第二个参数提供给 gsub 方法