生成一个字符类

时间:2016-02-15 00:25:52

标签: ruby regex

我正在尝试使用word.gsub(/[^#{guesses}]/i, '-')审核单词中的字母,其中wordguesses是字符串。

guesses""时,我收到此错误RegexpError: empty char-class: /[^]/i。我可以使用if / else语句对这些情况进行排序,但是我可以在正则表达式中添加一些内容以使其在一行中工作吗?

3 个答案:

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