在Ruby中由多个分隔符拆分

时间:2015-11-07 01:02:44

标签: arrays ruby regex string split

我需要从字符串中创建一个数组,我必须使用多个分隔符(除了空格):

! @ $#%^& *() - = _ + [] :; ,。 /< > ? \ |

我看过herehere,解决方案似乎是使用:

my_string.split(/[\s!@$#%^&*()-=_+[]:;,./<>?\|]/)

这是练习:

给定一个句子,返回一个包含其他每个单词的数组。 标点符号不是单词的一部分,除非它是收缩。 为了不必编写实际的语言解析器,不会有任何标点太复杂。 没有“'”不是收缩的一部分。

假设不考虑这些特征中的每一个:

! @ $#%^&amp; *() - = _ + [] :; ,。 /&lt; &GT; ? \ |

示例:

alternate_words("Lorem ipsum dolor sit amet.")  # => ["Lorem", "dolor", "amet"]
alternate_words("Can't we all get along?")      # => ["Can't", "all", "along"]
alternate_words("Elementary, my dear Watson!")  # => ["Elementary", "dear"]

这就是我尝试这样做的方式:

def every_other_word(sentence)
  my_words = []
  words = sentence.split(/[\s!@$^&*()-=_+[\]:;,.\/#%<>?\|]/)
  words.each_with_index do |w, i|
    next if i.odd?
    my_words << w
  end
  my_words
end

这是我得到的错误:

$ ruby ./session2/3-challenge/7_array.rb ./session2/3-challenge/7_array.rb:14: premature end of char-class: /[\s!@$^&*()-=_+[\]:;,.\/#%<>?\|]/

2 个答案:

答案 0 :(得分:0)

大多数提到的分隔字符在正则表达式文字中具有特殊含义。例如,]不是]字符,而是the end of a character class。链接页面应列出所有这些并解释其含义。

这些字符需要在正则表达式文字中进行转义,方法是在前面加上\。在此字符类-中,[]/\需要进行转义(^只需要转义{39} ; s是第一个字符-,只有在它不是最后一个字符的情况下才是{&lt; t}}:

/[\s!@$#%^&*()\-=_+\[\]:;,.\/<>?\\|]/

您也可以让Ruby使用Regexp.escape(又名Regexp.quote)来完成工作。它会逃避每个特殊字符,但生成的正则表达式将是等效的:

escaped_characters = Regexp.escape('!@$#%^&*()-=_+[]:;,./<>?\|')
/[\s#{escaped_characters}]/

顺便说一下,\s不像双引号字符串文字(一个奇怪的特征)那样只是空格,它也匹配其他ASCII空白字符(\n,{{1} },\t\r\f)。

答案 1 :(得分:0)

你被告知没有撇号而你无视:

BADDIES ='!@ $#%^&amp; *() - = _ + []:;,。/&lt;&gt;?\ |'

为什么不呢:

我们可以写:

str = "Now it the time for all good Rubiests to come to the aid of their " +
      "fellow coders (except for Bob)! Is that not true?"

str.delete(BADDIES).split.each_slice(2).map(&:first)
  #=> ["Now", "the", "for", "good", "to", "to", "aid", "their",
  #    "coders", "for", "Is", "not"] 

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