检查字符串

时间:2015-06-10 20:11:30

标签: arrays ruby string boolean

只有当所有字母都在两边都有“+”时,该函数才会返回true,但我总是认为我的价值是......我的代码中有什么缺陷?

def SimpleSymbol?(str)
str_array = str.split("")
i = 0
while i < str_array.length-1
    if ((str_array[i]  >= "a") && (str_array[i] <= "Z"))
        if  ((i == 0) || (i == str_array.length-1))
            return false
        end

        if ((str_array[i-1] != "+") && (str_array[i+1] != "+"))
            return false 
        end

    end
i += 1
end

return true
end

puts SimpleSymbol?("ads++d+")

3 个答案:

答案 0 :(得分:1)

  • &#34; Z&#34;是smaller而不是&#34; a&#34;。

  • 如果双方必须是+,并且检查不匹配,则逻辑连接为OR(=如果其中任何一个为真)。

    if ((str_array[i-1] != "+") || (str_array[i+1] != "+"))
    

注意:您不需要split,您可以索引字符串。

答案 1 :(得分:1)

最好用正则表达式处理:

def simple_symbol?(str)
  !!str.match(/\A(\+[a-zA-Z](?:\+[a-zA-Z])*\+)\z/)
end

[
  '+a+b+c+',
  '+a+b+c',
  'a+b',
  'abc++d+',
  '+',
  'abc',
  ''
].each do |string|
  puts '%-12s %s' % [ string, simple_symbol?(string) ]
end

# => +a+b+c+      true
# => +a+b+c       false
# => a+b          false
# => abc++d+      false
# => +            false
# => abc          false
# =>              false

请注意,Ruby方法名称的约定是使用underscore_type_names,因为CamelCase是为类和模块保留的。

答案 2 :(得分:0)

我同意@tadman在这里应该使用正则表达式。这是另一种方式,即查找+未加括号的字母:

R = /
    (?:     # begin a non-capture group
      \A    # match beginning of string
      |     # or
      [^+] # match any character other than +
    )       # end non-capture group
    [a-b]   # match a letter
    |       # or
    [a-b]   # match a letter
    (?:     # begin a non-capture group
      [^+] # match any character other than +
      |     # or
      \z    # match end of string
    )       # end non-capture group
    /xi     # use extended mode (x) and make case insensitive (i)

def letters_bracketed?(str)
   str !~ R
end

letters_bracketed?('+a+')         #=> true 
letters_bracketed?('+a+b+')       #=> true 
letters_bracketed?('+a+937+b+!!') #=> true 
letters_bracketed?('a+b+')        #=> false 
letters_bracketed?('+a+b')        #=> false 
letters_bracketed?('+?a+b+')      #=> false 
letters_bracketed?('+ab+')        #=> false 

请注意,+不需要在字符类中进行转义。