确定忽略逗号/句点的字符串数组的长度(仅限字母)

时间:2016-03-15 02:24:36

标签: ruby-on-rails arrays ruby string

我正在尝试找到确定字符串数组中字母数的最佳方法。我正在分割字符串,然后循环每个单词,然后分割字母并循环这些字母。

当我到达确定长度的位置时,我遇到的问题是它也在计算逗号和句号。因此,仅以字母表示的长度是不准确的。

我知道正则表达式可能要短得多,但我对此并不熟悉。我的代码通过了大多数测试,但我被困在逗号所在的位置。

E.g. 'You,' should be string.length = "3"

示例代码:

def abbr(str)
  new_words = []
  str.split.each do |word|
    new_word = []
    word.split("-").each do |w| # it has to be able to handle hyphenated words as well
      letters = w.split('')
       if letters.length >= 4
         first_letter = letters.shift
         last_letter = letters.pop
         new_word << "#{first_letter}#{letters.count}#{last_letter}"
       else 
         new_word << w
      end
    end
   new_words << new_word.join('-')
 end
 new_words.join(' ')

我在循环单词之前尝试gsub,但这不起作用,因为我不想完全删除逗号。我只是不需要他们被计算在内。

任何启示都表示赞赏。

4 个答案:

答案 0 :(得分:0)

试试这个:

LOCAL_ARM_NEON := true
LOCAL_SRC_FILES := jsimd_arm_neon.S.neon

def abbr(str) str.gsub /\b\w+\b/ do |word| if word.length >= 4 "#{word[0]}#{word.length - 2}#{word[-1]}" else word end end end 调用中的正则表达式表示&#34;一个或多个单词字符前后跟着单词边界&#34;。传递给gsub的块对每个单词进行操作,来自块的返回是替换单词&#39;在gsub中匹配。

答案 1 :(得分:0)

arr = ["Now is the time for y'all Rubiests",
       "to come to the aid of your bowling team."]
arr.join.size
  #=> 74  

没有正则表达式

def abbr(arr)
  str = arr.join
  str.size - str.delete([*('a'..'z')].join + [*('A'..'Z')].join).size
end

abbr arr
  #=> 58

此处和下方,arr.join将数组转换为单个字符串。

使用正则表达式

R = /
    [^a-z] # match a character that is not a lower-case letter
    /ix    # case-insenstive (i) and free-spacing regex definition (x) modes

def abbr(arr)
  arr.join.gsub(R,'').size
end

abbr arr
  #=> 58

你当然可以写:

arr.join.gsub(/[^a-z]/i,'').size
  #=> 58

答案 2 :(得分:0)

你可以检查每个字符的ascii值是否在97-122或65-90。当满足这个条件时,增加一个局部变量,它将给你一个字符串的总长度,没有任何数字或任何特殊字符或任何白色空间。

答案 3 :(得分:0)

你可以使用类似的东西(短版):

a.map { |x| x.chars.reject { |char| [' ', ',', '.'].include? char } }

长版本说明:

a = ['a, ', 'bbb', 'c c, .']     # Initial array of strings
excluded_chars = [' ', ',', '.'] # Chars you don't want to be counted

a.map do |str|                   # Iterate through all strings in array
  str.chars.reject do |char|     # Split each string to the array of chars
    excluded_chars.include? char # and reject excluded_chars from it 
  end.size # This returns [["a"], ["b", "b", "b"], ["c", "c"]] 
end        # so, we take #size of each array to get size of the string

# Result: [1, 3, 2]