我有多种字符串需要从中提取“TM”、“(c)”等。这些标记是 unicode 格式的。现在我只想取出所有 unicode,一旦我开始工作,我会更有选择性,只取出法律标记。这是代码:
strings = ['Star Wars \u2122 2', 'Empire Strikes Back\u00C2\u00AE The Strikening',
"Star Wars\u2122 2", "Empire Strikes Back\u00C2\\u00AE The Strikening"]
p strings.inspect
strings.each { |str|
sub = str.gsub(/\\(u[(\d)a-fA-F]{4})/, "")
p sub
}
结果:
["Star Wars \\u2122 2", "Empire Strikes Back\\u00C2\\u00AE The Strikening", "Star Wars\u2122 2", "Empire Strikes Back\u00C2\\u00AE The Strikening"]
"Star Wars 2"
"Empire Strikes Back The Strikening"
"Star Wars\u2122 2"
"Empire Strikes Back\u00C2 The Strikening"
适用于单引号,但不适用于双引号。我知道单引号字符串的行为与双引号字符串不同。这里的问题是,被送入此函数的字符串表现为双引号字符串并破坏了代码(不会发生替换)。我尝试在 gsub 之前添加 sub('\\', '\\\\')
但这并没有解决问题。
我想我对字符串在 Ruby 中的行为有一些误解。如何可靠地从 "Star Wars\u2122 2"
中删除 unicode 符号?我拥有的正则表达式没有这样做。
ruby 1.9.3
最佳答案
这可能有点低效,因为它构建了一个包含其中每个字符的数组,但它可以工作(在 Ruby 1.9 和更高版本中):
s = "Empire Strikes Back\u00C2\u00AE The Strikening"
t = s.chars.select(&:ascii_only?).join # => "Empire Strikes Back The Strikening"
当您编写 '\u00C2'
时,您并不是在创建包含 unicode 的字符串。您正在创建一个包含 5 个 ASCII 字符的字符串。当您编写 "\u00C2"
时,您正在创建一个包含单个非 ASCII unicode 字符的字符串。这是双引号和单引号之间的区别之一。
关于ruby - 从字符串中可靠地删除 unicode 的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8186301/