【问题标题】:Checking strings检查字符串
【发布时间】:2015-08-26 07:08:35
【问题描述】:

只有当所有字母的两边都有“+”时,该函数才应该返回 true,但我总是将 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+")

【问题讨论】:

    标签: arrays ruby string boolean


    【解决方案1】:

    我同意@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 
    

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

    【讨论】:

      【解决方案2】:
      • “Z”是smaller而不是“a”。

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

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

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

      【讨论】:

      • 知道了,谢谢!我只是假设它在逻辑上“a”似乎小于“Z”,应该查一下。 :]
      【解决方案3】:

      最好用正则表达式处理:

      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 是为类和模块保留的。

      【讨论】:

        猜你喜欢
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多