在可变数量的单词上拆分字符串

时间:2015-02-20 01:53:51

标签: ruby regex

@ruhroe大约一小时前发布了以下问题。当它被取消时,我正要发布一个答案。这很不幸,因为我认为它很有趣。如果OP看到这一点,我会把它重新放回去,并让其他人有机会发布解决方案。

原始问题(我编辑过):

问题是在字符串中的某些空格上拆分字符串,这取决于部分取决于用户给出的数字的标准。如果该数字为5,则每个子字符串将包含:

  • 一个字有5个或更多字符或
  • 尽可能多的连续单词(用空格分隔),前提是结果字符串最多包含5个字符。

例如,如果字符串是:

"abcdefg fg hijkl mno pqrs tuv wx yz"

结果将是:

["abcdefg", "fg", "hijkl", "mno", "pqrs", "tuv", "wx yz"]
  • "abcdefg"位于一个单独的行上,因为它至少包含五个字符。
  • "fg"位于一个单独的行上,因为"fg"包含5个或几个字符,当与后面的单词结合使用时,它们之间有空格,结果字符串"fg hijkl"包含更多超过5个字符。
  • "hijkl"位于单独的一行,因为它符合两个条件。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

我相信这样做:

str = "abcdefg fg hijkl e mn pqrs tuv wx yz"

str.scan(/\b(?:\w{5,}|\w[\w\s]{0,3}\w|\w)\b/)
  #=> ["abcdefg", "fg", "hijkl", "e mn", "pqrs", "tuv", "wx yz"] 

答案 1 :(得分:1)

当您遍历集合中的单词时(将原始字符串拆分为单词应该是微不足道的),似乎有三种可能的情况:

  1. 这是一个空白行,我们应该将当前单词插入行
  2. 这是一个非空行,而且这个词可以适合
  3. 这是一个非空行,这个词不合适,应该进入一个新的行
  4. 这样的事情应该有效(注意 - 我还没有在你的解决方案之外进行过这样的测试。你绝对想要这样做):

    words.each do |word|
      if line.blank?
        # this is a new line, so start it with the current word
        line << word
      elsif word_can_fit_line?(line, word, length)
        # the word fits, so append it to the current line
        line << " #{word}"
      else
        # the word doesn't fit, so keep this line and start a new one with
        # the current word
        lines << line
        line = word
      end
    end
    
    # add the last line and we're done
    lines << line
    
    lines
    

    请注意word_can_fit_line?的实现应该是微不足道的 - 您只想查看当前行长度加上空格加上字长是否小于或等于您想要的行长度。