我正在尝试使用word.gsub(/[^#{guesses}]/i, '-')
审核单词中的字母,其中word
和guesses
是字符串。
当guesses
为""
时,我收到此错误RegexpError: empty char-class: /[^]/i
。我可以使用if / else语句对这些情况进行排序,但是我可以在正则表达式中添加一些内容以使其在一行中工作吗?
答案 0 :(得分:1)
由于您只匹配(或不匹配)字母,因此您可以在正则表达式中添加非字母字符,例如#
或%
:
word.gsub(/[^%#{guesses}]/i, '-')
请参阅IDEONE demo
如果#{guesses}
为空,则正则表达式仍然有效,并且由于%
没有出现在单词中,因此不存在谴责某些猜测百分比符号的风险。
答案 1 :(得分:1)
您有两种选择。一种是避免测试你的比赛是否为空,即:
unless (guesses.empty?)
word.gsub(/^#{Regex.escape(guesses)}/i, '-')
end
虽然这不是你的意图,但它确实是最安全的计划,并且在代码方面是最明确的。
或者您可以使用tr
函数,但仅限于非空字符串,因此可以在unless
块中替换:
word.tr('^' + guesses.downcase + guesses.upcase, '-')
如果频繁使用,通常tr
的效果优于gsub
。它也不需要任何特殊的转义。
修改:添加了关于tr
无法处理空字符串的说明。
由于tr
将^
视为空字符串的特殊情况,因此您可以使用嵌入式三元组,但最终会混淆相应的内容:
word.tr(guesses.empty? ? '' : ('^' + guesses.downcase + guesses.upcase), '-')
答案 2 :(得分:0)
这看起来有点类似于tadman的答案。
可能你应该保留代表你想隐藏的字符串,而不是你想要显示的字符串。我们假设这是remains
。然后,它会很容易:
word.tr(remains.upcase + remains.downcase, "-")