从保留字符串的字符串中删除非字母数字字符

时间:2018-05-28 10:34:41

标签: ruby

我需要移除诸如" +"," /"," _"等字符。和字符串类似,以执行搜索方法。

根据其他问题,我使用gsub方法,问题是它也替代了我不想要的强调字母:

string.gsub(/[^0-9A-Za-z]/, '')

编辑:我需要支持的语言是西班牙语和加泰罗尼亚语。

有没有办法调整表达式以保留带重音的字母?

3 个答案:

答案 0 :(得分:4)

到目前为止,这里给出的答案都是完全错误的。

现代unicode中有两种类型的重音:组合和组合变音符号(已分解)。使用Ruby 2.3+,一切都很简单:

"Barça".unicode_normalize(:nfc).scan(/\p{L}/)
#⇒ ["B", "a", "r", "ç", "a"]

无论如何构建“ç”,作为拉丁文1组成的角色,或者作为组合变音符号,上述内容都将有效。

那就是说,要删除所有字母,可以这样做:

"Barça".unicode_normalize(:nfc).gsub(/[^\p{L}]/, '')

在Ruby 2.3之前,没有标准的方法来将字符串规范化为组合形式,而对于“mañana”,简单范围À..ÿ将起作用(组成形式),对于“mañana”它不会(组合)变音符号。)您可以通过将两者复制粘贴到irb shell中来确保自己存在差异。

答案 1 :(得分:1)

您还可以使用POSIX bracket expression。您会在ruby-docs中找到所有需要的documentation

在您的情况下,您可以使用:

string.gsub(/[^[:alpha:]]/, '')

或:

string.gsub(/[^[:alnum:]]/, '')

来自文档:

  

/ [[:alnum:]] / - 字母和数字字符

     

/ [[:alpha:]] / - 字母字符

答案 2 :(得分:0)

借用this question的答案,许多(但不是全部)重音字符的正则表达式字符范围是À-ÿ。因此,要匹配这些,您只需将其添加到现有范围:

string.gsub(/[^0-9A-Za-zÀ-ÿ]/, '')

它在很大程度上取决于您正在寻找的重音,因为有太多的重音符号可以轻松匹配所有。这个示例正则表达式将保留例如急性/严重重音,但是错过了月牙:

puts "I went to a café.".gsub(/[^0-9A-Za-zÀ-ÿ]/, '') # Iwenttoacafé
puts "Ahoj, světe!".gsub(/[^0-9A-Za-zÀ-ÿ]/, '')      # Ahojsvte

这可能适用于您的用例,但如果您正在处理捷克语文本,则可能需要额外的字符范围来匹配月牙。