GSUB!论证不起作用

时间:2011-05-07 23:48:35

标签: ruby

我正在创建一个函数,将第一个参数转换为PHP var(无用,我知道),并将其设置为等于第二个参数。我正在尝试gsub!它来摆脱PHP var中无法使用的所有字符。这就是我所拥有的:

dvar = "$" + name.gsub!(/.?\/!@\#{}$%^&*()`~/, "") { |match| puts match }

我有puts match,以确保删除了一些字符。 name是传递给方法的变量,其中这是其目的。我收到了这个错误:

TypeError: can't convert nil into String
cVar at ./Web.rb:31
(root) at C:\Users\Andrew\Documents\NetBeansProjects\Web\lib\main.rb:13

Web.rb是此行所在的文件,main.rb是调用此方法的文件。我该如何解决这个问题?

编辑:如果我删除了!在gsub!中,它会通过,但字符不会删除。

4 个答案:

答案 0 :(得分:5)

简短回答

使用dvar = "$" + name.tr(".?\/!@\#{}$%^&*()``~", '')

答案很长

你面临的问题是gsub!电话正在返回零。你不能用一个nil连接(+)一个String。

这种情况正在发生,因为你有一个格式错误的Regexp。你没有逃避特殊的正则表达式符号,比如$,*和。,只是为了一个开始。此外,它现在的方式,只有当你的字符串按顺序包含所有符号时,gsub才会匹配。您应该使用管道(|)运算符进行OR运算。

GSUB!如果没有发生替换,也将返回nil  请参阅gsub和gsub的文档!在这里:http://ruby-doc.org/core/classes/String.html#M001186
我想你应该替换gsub!与gsub。你真的需要name来改变吗?

示例:

name = "m$var.name$$"
dvar = "$" + name.gsub!(/\$|\.|\*/, "") # $ or . or *
# dvar now contains $mvarname and name is mvarname

你的行,更正了:

dvar = "$" + name.gsub(/\.|\?|\/|\!|\@|\\|\#|\{|\}|\$|\%|\^|\&|\*|\(|\)|\`|\~/, "")
# some things shouldn't (or aren't needed to) be escaped, I don't remember them all right now

当J -_- L指定时,你也可以使用一个字符类([]),这使得它更清晰一点,我想。好吧,无论如何,精神上很难解析。

dvar = "$" + name.gsub(/[\.\?\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")

但是因为你所做的是简单的字符替换,最好的方法是tr(再次提醒J -_- L!):

dvar = "$" + name.tr(".?\/!@\#{}$%^&*()`~", '')

更容易阅读和修改。

答案 1 :(得分:3)

我看不到该块的用途 只是做

name = 'hello.?\/!@#$%^&*()`~hello'
dvar = "$" + name.gsub(/\.|\?|\\|\/|\!|\@|\#|\{|\}|\$|\%|\^|\&|\*|\(|\)|\`|\~/, "")
puts dvar # => "$hellohello"

或使用[]表示OR

dvar = "$" + name.gsub(/[\.\?\\\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")

你必须逃避特殊字符然后删除它们以便它们将单独删除它们而不仅仅是它们全部被发现

也确实没有必要使用gsub!来修改字符串使用非mutator gsub(),因为你将它分配给一个新的变量,

gsub!返回nil,其中没有为stings定义operator +,这为你提供了no method error

答案 2 :(得分:3)

  • 您无法应用第二个参数 一个块到gsub(块被忽略)
  • 正则表达式错了,你忘记了 方括号: /[.?\/!@\#{}$%^&*()〜] /`
  • 因为你的正则表达式是错误的 什么都不匹配,因为 GSUB!如果没有,则返回nil 换了,你得到这个奇怪的没有 方法错误
  • btw:你应该使用gsub而不是gsub!在 这种情况,因为你正在使用 返回值(而不是名称本身) - 并且错误不会发生

答案 3 :(得分:2)

似乎'name'对象是nil,你可能正在调用gsub!在nil上通常会抱怨NoMethodError:私有方法gusb!调用nilNilClass,因为我不知道你使用的ruby的版本我不确定错误是否相同,但它是一个开始查看的好地方。