作为练习,我正在编写口音翻译词典。我的字典包含在哈希中,我正在考虑使用#gsub!
通过翻译器运行输入的字符串。
我想知道是否有任何方法可以使替换区分大小写。例如,我希望"didja"
转换为"did you"
和"Didja"
转换为"Did you"
,但我不想创建多个字典条目来处理案例
我知道我可以使用正则表达式语法来查找字符串以使用str.gsub!(/#{x}/i,dictionary[x])
替换不区分大小写的字符串,其中x
是一个变量。问题是,这会将"Didja"
替换为"did you"
,而不是匹配原始案例。
有没有办法让它与原案相符?
答案 0 :(得分:2)
目前尚不清楚您的资本化模式是什么。我假设您只需要处理除了第一个字母以外的小写或全部小写的单词。
str.gsub!(/#{x}/i){|x| x.downcase! ? dictionary[x].capitalize : dictionary[x]}
答案 1 :(得分:2)
假设我们有:
to_key
,用于将字符串str
转换为哈希DICTIONARY
中的键;和transform
,用于将[str, DICTIONARY[to_key(str)]]
对转换为str
的替换。然后将str
替换为:
transform(str, DICTIONARY[to_key(str)]])
在不失一般性的情况下,我认为我们可以假设DICTIONARY
的键和值都是相同的情况(例如小写),而to_key
只是:< / p>
def to_key(str)
str.downcase
end
所有必要的是定义方法transform
。但是,提供的规范并不意味着唯一的映射。因此,我们必须决定transform
应该做什么。
例如,假设规则很简单,如果str
的第一个字符和字典值的第一个字符都是字母,如果前者是大写字母,后者将被转换为大写字母。然后:
def transform(str, dict_value)
(str[0] =~ /[A-Z]/) ? dict_value.capitalize : dict_value
end
(我最初有dict_value[0] = dict_value[0].upcase if...
,但在阅读了@ sawa的回答后,我才明白了。)
请注意,如果DICTIONARY['cat'] => 'dog'
,'Cat'
将转换为'Dog'
。
有人可能会认为另一种可能性是str
的所有字母都应该保留其字母。然而,这是有问题的,因为字典映射可能(没有进一步说明)删除字母,并且DICTIONARY[str]
可能不清楚删除了str
的哪些字母,其中一些可能是小写字母和其他大写。
答案 2 :(得分:1)
我不认为这是可能的,因为在这种情况下,您需要指定必须取代替换字符串的确切字符串。
考虑到这一点,这是我能提出的最佳建议:
subs = {'didja' => 'did you'}
subs.clone.each{ |k, v| subs[k.capitalize] = v.capitalize }
# if you want to replace all occurrences i.e. even substrings:
regex = /#{subs.keys.join('|')}/
# if you want to remove complete words only: (as the Tin man points out)
regex = /\b(?:#{subs.keys.join('|')})\b/ # \b checks for word-boundaries
"didja Didja".gsub(regex, subs)
<强>更新强>
因为在您的示例中,区分大小写的字符不会被其他值替换,您可以使用:
regex = /(?<=(d))idja/i # again, keep in mind the substrings
"didja Didja".gsub(regex, "id you")