如何更换字符串并节省大写字母?

时间:2017-01-12 05:19:08

标签: ruby-on-rails ruby regex gsub

使用ruby,是否可以替换字符串并节省大写字母。

想法是匹配“美好的一天”并将其变成“大声”并保留原始大写。例如:

在:

Good day to you sir and lady.
Hello and good day.

后:

Holler to you sir and lady.
Hello and holler.

由于

6 个答案:

答案 0 :(得分:1)

如果您打算保留字符串的一部分并附加到该字符串,请使用返回引用和不区分大小写的搜索模式

yourstring.gsub(/(good day)/i, "\\1 and good night")

您可以在rubular

中的ruby找到有关正则表达式如何工作的说明

<强>更新

因为,正如您在评论和更新后的问题中所述,您希望替换的第一个字母是否大写,根据模式,我认为这种略微冗长而有效的gsub方法可以帮助您:< / p>

string = "Good day to you sir and lady. \nHello and good day."
puts string.gsub(/[gG]ood day/, 'good day' =>'holler', 'Good day'=>'Holler')
# Holler to you sir and lady.
# Hello and holler.

根据ruby 1.8.7gsub可以接受散列作为第二个参数,并替换模式描述的可能匹配项。因此,上述语法等同于:

puts string.gsub(/[gG]ood day/, {'good day' =>'holler', 'Good day'=>'Holler'})

答案 1 :(得分:1)

你可以使用带有ignore case选项的Regexp转义方法来做这样的事情:

reg = Regexp.new(Regexp.escape("good day"), Regexp::IGNORECASE)

"good day".gsub(reg){|match| "#{match} and good night" }
=> "good day and good night"


"Good dAy".gsub(reg){|match| "#{match} and good night" }
=> "Good dAy and good night"

编辑以匹配更新的问题

使用与原始问题的答案类似的想法

"Good day".gsub(reg){|match| "#{match.capitalize == match ? 'Holler' : 'holler'} and good night" }
=> "Holler and good night"

"good day".gsub(reg){|match| "#{match.capitalize == match ? 'Holler' : 'holler'} and good night" }
=> "holler and good night"

答案 2 :(得分:1)

您可以将一个块传递给gsub,然后您可以操作匹配的字符串

传递 i 选项会使正则表达式不区分大小写

string = "Good day to you sir and lady."

string.gsub(/good day/i) { |m| "#{m} and good night" }

#=> "Good day and good night to you sir and lady."

string = "Hello and good day."

string.gsub(/good day/i) { |m| "#{m} and good night" }

#=> "Hello and good day and good night."

参考gsub

答案 3 :(得分:1)

此方法:

  • old_str
  • 中对text应用不区分大小写的搜索
  • 找到的每个old_str
    • 它会并行迭代new_strold_str个字符
    • 它在old_str
    • 上应用了new_str案例
def case_aware_replace(text, old_str, new_str)
  text.gsub(/#{old_str}/i) do |word|
    new_str.chars.zip(word.chars).map do |new_char, old_char|
      if old_char
        old_char.downcase == old_char ? new_char : new_char.upcase
      else
        new_char
      end
    end.join
  end
end

puts case_aware_replace('Good day to you sir and lady.', 'good day', 'holler')
#=> Holler to you sir and lady.

puts case_aware_replace('Hello and good day.', 'good day', 'holler')
#=> Hello and holler.

puts case_aware_replace('HELLO GRANDMA!', 'hello', 'hi')
#=> HI GRANDMA!

puts case_aware_replace('AaAaAaA', 'a', 'b')
#=> BbBbBbB

puts case_aware_replace('AaAaAaA', 'a', 'b ')
#=> B b B b B b B

puts case_aware_replace(case_aware_replace(case_aware_replace('IBM', 'i', 'international '),'b', 'business '),'m', 'machines ')
#=> International Business Machines

答案 4 :(得分:-1)

确保会有更优雅的解决方案,但这也有帮助。

2.3.1 :003 > a = "Good day to you sir and lady".downcase.gsub('good day', 'good day and good night').capitalize
 => "Good day and good night to you sir and lady" 

我所做的是,

  • 将所有字母更改为小写,
  • 取代相关部分,
  • 然后大写。

答案 5 :(得分:-1)

Hellor to you sir and lady.                                                                                                                                                                             
Hello and hellor.   

将返回

function GetXmlHttpObject(){
var xmlHttp=null;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
return xmlHttp;
}

var xmlhttp=GetXmlHttpObject();

只有两种情况(假设只有首字母可以大写),直接替换两种情况就足够了。