我需要移除诸如" +"," /"," _"等字符。和字符串类似,以执行搜索方法。
根据其他问题,我使用gsub方法,问题是它也替代了我不想要的强调字母:
string.gsub(/[^0-9A-Za-z]/, '')
有没有办法调整表达式以保留带重音的字母?
答案 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
这可能适用于您的用例,但如果您正在处理捷克语文本,则可能需要额外的字符范围来匹配月牙。