Ruby:反斜杠字符串中的所有非字母数字字符

时间:2011-02-10 07:37:22

标签: ruby regex

我有一个脚本,我需要获取用户的密码,然后使用它运行命令行。我需要在密码中反斜杠所有(可能多于一个)非字母数字字符。我在这一点上已经尝试了几件事,包括下面但没有在哪里。这很简单,只是错过了它。

尝试过这些以及其他几个:

password = password.gsub(/(\W)/, '\\1')

password = password.gsub(/(\W)/, '\\\1')

password = password.gsub(/(\W)/, '\\\\1')

3 个答案:

答案 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"