Ruby gsub!关于一个论点';行不通
我正在制作一个函数,将第一个参数转换为一个PHP变量(我知道这是无用的),并将其设置为第二个参数。我正在尝试Ruby gsub!关于一个论点';行不通,ruby,Ruby,我正在制作一个函数,将第一个参数转换为一个PHP变量(我知道这是无用的),并将其设置为第二个参数。我正在尝试gsubit可以去除PHP变量中无法使用的所有字符。以下是我所拥有的: dvar = "$" + name.gsub!(/.?\/!@\#{}$%^&*()`~/, "") { |match| puts match } Web.rb是此行所在的文件,main.rb是调用此方法的文件。我怎样才能解决这个问题 编辑:如果我删除了!在gsub!,它会通过,但字符不会被删除。似乎“name”对象为
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!在里面 这种情况下,因为您正在使用 返回值(而不是名称本身)-- 这样错误就不会发生了
tr
-只需在第一个字符串中列出所有字符:name.tr(“.?\/!@\{}$%^&*()”`~”,“”)
dvar = "$" + name.tr(".?\/!@\#{}$%^&*()`~", '')
name = 'hello.?\/!@#$%^&*()`~hello'
dvar = "$" + name.gsub(/\.|\?|\\|\/|\!|\@|\#|\{|\}|\$|\%|\^|\&|\*|\(|\)|\`|\~/, "")
puts dvar # => "$hellohello"
dvar = "$" + name.gsub(/[\.\?\\\/\!\@\\\#\{\}\$\%\^\&\*\(\)\`\~]/, "")