使用gsub进行区分大小写的替换

时间:2015-03-18 17:01:14

标签: ruby regex

作为练习,我正在编写口音翻译词典。我的字典包含在哈希中,我正在考虑使用#gsub!通过翻译器运行输入的字符串。

我想知道是否有任何方法可以使替换区分大小写。例如,我希望"didja"转换为"did you""Didja"转换为"Did you",但我不想创建多个字典条目来处理案例

我知道我可以使用正则表达式语法来查找字符串以使用str.gsub!(/#{x}/i,dictionary[x])替换不区分大小写的字符串,其中x是一个变量。问题是,这会将"Didja"替换为"did you",而不是匹配原始案例。

有没有办法让它与原案相符?

3 个答案:

答案 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")