如何计算字符串中两个字符之间的字符数

时间:2015-07-22 06:00:12

标签: ruby string

这是问题提示:

  

编写一个带字符串的方法,如果是这个字母则返回true       在"z"之后,"a"出现在三个字母内。你可以假设       字符串只包含小写字母。

我尝试使用三元运算符,并希望包含matchcount方法。关于如何找到"a""z"之间的字符数或解决此问题的最简单方法的任何想法?

def nearby_az(string)
  string.count <= 3 ? true : false
end

3 个答案:

答案 0 :(得分:7)

正则表达式是解决这个问题的好方法。

您可以使用online regex testers来试验不同的正则表达式,输入和输出。

我想到的第一个解决方案是为每个可能的正确输入提出一个模式:

  • az
  • a [a-z] z
  • 一个[A-Z] [A-Z】Z

这意味着:

  • 匹配字符串“az”
  • 将字符串与“a”匹配,然后将字符从“a”匹配为“z”,然后匹配“z”字符
  • 将字符串与“a”匹配,然后将“a”中的2个字符匹配为“z”,然后填写“z”

然后将它们与'或'运算符(|)

组合
  • AZ |一个[AZ】Z |一个[AZ] [AZ】Z

这意味着匹配所有这三个条件。

A link to this example is here

这样做有点冗长,所以可以通过更紧凑的方式表达它来改进:

  • 一个[A-Z] {0,2}ž

这意味着:

  • 匹配“a”然后匹配“a”到“z”的字符0,1或2次,然后匹配“z”

A link to this example is here

您在名为match的ruby字符串上使用该方法,该字符串接收正则表达式对象,然后检查布尔返回值。

编辑:

ruby​​代码看起来像这样:

def nearby_az(string)
  return string.match(/a[a-z]{0,2}z/) != nil
end

string.match()返回一个对象,您可以查询该对象以获取有关匹配的信息。如果没有匹配,string.match()将返回nil。

答案 1 :(得分:5)

!!("fjeioaeiz" =~ /a.{,2}z/) #=> true
!!("fjeioaz" =~ /a.{,2}z/) #=> true
!!("fjeioasbdz" =~ /a.{,2}z/) #=> false

答案 2 :(得分:1)

看,马!没有正则表达式!

def a_upto_4_z(str)
   str.each_char.with_index.any? { |c,i| c == ?a && str[i+1,3].include?(?z) }
end

a_upto_4_z "rvaxxzo"  #=> true 
a_upto_4_z "rvaxxxzo" #=> false 
a_upto_4_z "rvaxzo"   #=> true 
a_upto_4_z "rvazo"    #=> true 
a_upto_4_z "rvzao"    #=> false 

编辑:@Stefan提出了一个很好的观点。让我们这样做:

def mind_the_gap(str, max_gap=2)
  gap = max_gap + 1 # or larger
  str.each_char do |c|
    case c
    when ?z
      return true if gap <= max_gap
    when ?a
      gap = 0
    else
      gap += 1
    end
  end
  false
end

mind_the_gap "rvaxxzo"  #=> true 
mind_the_gap "rvaxxxzo" #=> false 
mind_the_gap "rvaxzo"   #=> true 
mind_the_gap "rvazo"    #=> true 
mind_the_gap "rvzao"    #=> false 

请注意,gapc == ?z时无需增加gap > max_gap