在Ruby字符串中取消转义特殊字符序列

5

我正在从一个包含以下序列的文件中加载文本:

abc\ndef\tghi

我希望能够“取消转义”所有特殊字符,例如将\n视为换行符,\t视为制表符等,而不是自动地以\\n\\t的形式出现在字符串中。

有没有简单的方法可以做到这一点?

3个回答

7

文本将按文件中的内容加载。 如果文件中有字面文本\和n而不是换行符,则将加载此内容。 如果您想更改已知的一组转义字符,可以简单地使用gsub替换它们。

line='abc\ndef\tghi'
line.gsub!('\n', "\n")
line.gsub!('\t', "\t")

3
我担心会得到这样的答案 :-) 这将使开发人员负责查找和替换每个已知的转义集。如果有像String#unescape这样的方法来完成这项工作就好了。 - mydoghasworms
Matt,请看一下我对Telemachus答案的评论。 - mydoghasworms

1
我觉得应该有一种更优雅的方法来做这件事,但你可以编写通用方法来进行交换:
def unescape(string)
  dup = string.dup
  escaped_chars = ['n', 't', 'r', 'f', 'v', '0', 'a']
  escaped_subs = {
    "n" => "\n",
    "t" => "\t",
    "r" => "\r",
    "f" => "\f",
    "v" => "\v",
    "0" => "\0",
    "a" => "\a"
  }

  pos = 0
  while pos < dup.length
    if dup[pos] == '\\' and escaped_chars.include? dup[pos + 1]
      dup[pos..(pos + 1)] = escaped_subs[dup[pos + 1]]
    end
    pos += 1
  end

  return dup
end

在你和马特的答案之间做出选择很困难。哪个会表现得更好?我有一种感觉,从长远来看,你的是String类的更好补充,但如果需要快速解决问题,我会选择马特的答案。 - mydoghasworms
1
@mydoghasworms 好的,我很理解。我很快地回应了你的评论:“开发人员需要找到并替换每个已知的转义字符”,所以我把这个东西拼凑在一起。这样,你只需要一次性解决所有问题。尽管如此,对于99%的情况来说,这可能有点过头了。 - Telemachus

1

YAML.unescape 怎么样?

require 'syck/encoding'
require 'yaml'

YAML.unescape("\\n")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接