我有一个脚本,我需要获取用户的密码,然后使用它运行命令行。我需要在密码中反斜杠所有(可能多于一个)非字母数字字符。我在这一点上已经尝试了几件事,包括下面但没有在哪里。这很简单,只是错过了它。
尝试过这些以及其他几个:
password = password.gsub(/(\W)/, '\\1')
password = password.gsub(/(\W)/, '\\\1')
password = password.gsub(/(\W)/, '\\\\1')
答案 0 :(得分:4)
如有疑问,请添加更多后背? =)
password = password.gsub(/(\W)/, '\\\\\\1')
这似乎有效,请参阅http://ideone.com/n3C0b
不要问我为什么!
答案 1 :(得分:4)
虽然Jens的一堆牙签确实对它有一定的反常美感,但我认为使用gsub
的块版本可能会更好:
password = password.gsub(/(\W)/) { |c| '\\' + c }
尽管适合你的任何事情。
答案 2 :(得分:0)
就像一个FYI -
Ruby 1.9有Regex.escape
内置核心:
strings = [
'foo|bar',
'(foo|bar)',
'(?:foo|bar)',
"foo/bar\n",
"foo\/bar\n",
"foo\/bar\\n"
]
regex = strings.map { |s| Regexp.escape(s) }
puts regex
puts '-' * 40
而且,正如@Nakilon在评论中所说,有检查:
strings.each do |r|
puts r.inspect
end
# >> foo\|bar
# >> \(foo\|bar\)
# >> \(\?:foo\|bar\)
# >> foo/bar\n
# >> foo/bar\n
# >> foo/bar\\n
# >> ----------------------------------------
# >> "foo|bar"
# >> "(foo|bar)"
# >> "(?:foo|bar)"
# >> "foo/bar\n"
# >> "foo/bar\n"
# >> "foo/bar\\n"