Ruby gsub!关于一个论点';行不通

Ruby gsub!关于一个论点';行不通,ruby,Ruby,我正在制作一个函数,将第一个参数转换为一个PHP变量(我知道这是无用的),并将其设置为第二个参数。我正在尝试gsubit可以去除PHP变量中无法使用的所有字符。以下是我所拥有的: dvar = "$" + name.gsub!(/.?\/!@\#{}$%^&*()`~/, "") { |match| puts match } Web.rb是此行所在的文件,main.rb是调用此方法的文件。我怎样才能解决这个问题 编辑:如果我删除了!在gsub!,它会通过,但字符不会被删除。似乎“name”对象为

我正在制作一个函数,将第一个参数转换为一个PHP变量(我知道这是无用的),并将其设置为第二个参数。我正在尝试
gsub
it可以去除PHP变量中无法使用的所有字符。以下是我所拥有的:

dvar = "$" + name.gsub!(/.?\/!@\#{}$%^&*()`~/, "") { |match| puts match }
Web.rb
是此行所在的文件,
main.rb
是调用此方法的文件。我怎样才能解决这个问题


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

似乎“name”对象为nil,您可能正在调用gsub!在nil上,通常会抱怨一个命名错误:private method gusb!调用NilClass,因为我不知道您使用的ruby版本,我不确定错误是否相同,但这是一个开始查看的好地方。

简短回答 使用
dvar=“$”+name.tr(“.?\/!@\\{}$%^&*()“`~”,“”)

长话短说 您面临的问题是gsub!呼叫返回零。不能将(+)字符串与nil串联

发生这种情况是因为您的Regexp格式不正确。您并不是为了开始而转义特殊的正则表达式符号,如$、*和。另外,按照现在的方式,gsub将只在字符串包含所有按顺序排列的符号时匹配。您应该使用管道(|)操作符进行或类似的操作

gsub!如果没有发生替换,也将返回nil。
请参阅gsub和gsub的文档!此处:
我认为你应该取代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-u-L所指定的,您还可以使用字符类([]),我想这会让它更清晰一些。好吧,不管怎样,很难在精神上进行分析

dvar = "$" + name.gsub(/[\.\?\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")
但是,因为您所做的是简单的字符替换,所以最好的方法是tr(再次由J--L提醒!):


更容易阅读和修改。

我看不出块是用来做什么的 照办

或使用[]表示或

dvar = "$" + name.gsub(/[\.\?\\\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")
您必须转义特殊字符,然后或它们,这样它将单独删除它们,而不仅仅是它们一起被发现

而且真的没有必要使用
gsub
要就地修改字符串,请使用非变数
gsub()
,因为您将其分配给了一个新变量

gsub
返回nil,其中没有为STING定义运算符+,这会给出所提到的no方法错误

  • 不能应用第二个参数 到gsub的块(忽略该块)
  • 正则表达式错了,你忘了 方括号:
    /[.?\/!@\\{}$%^&*()
    ~]/`
  • 因为你的正则表达式是错的,所以 什么都不匹配,因为 gsub!如果未显示任何内容,则返回nil 替换,你得到这个奇怪的零不 方法错误
  • 顺便说一句:你应该使用gsub而不是gsub!在里面 这种情况下,因为您正在使用 返回值(而不是名称本身)-- 这样错误就不会发生了

它是JRuby 1.6.1。我还有一个类型检查:if name.class!=String放入“第一个变量必须是字符串!”exit(1)endname不是nil,而是name.gsub!由于没有替换,所以返回nil。顺便说一句,删除单个字符的超级秘密方法是
tr
-只需在第一个字符串中列出所有字符:
name.tr(“.?\/!@\{}$%^&*()”`~”,“”)
dvar = "$" + name.tr(".?\/!@\#{}$%^&*()`~", '')
name = 'hello.?\/!@#$%^&*()`~hello'
dvar = "$" + name.gsub(/\.|\?|\\|\/|\!|\@|\#|\{|\}|\$|\%|\^|\&|\*|\(|\)|\`|\~/, "")
puts dvar # => "$hellohello"
dvar = "$" + name.gsub(/[\.\?\\\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")