我需要从字符串中创建一个数组,我必须使用多个分隔符(除了空格):
! @ $#%^& *() - = _ + [] :; ,。 /< > ? \ |
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!@$^&*()-=_+[\]:;,.\/#%<>?\|]/
答案 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;?\ |'
为什么不呢:
BADDIES
我们可以写:
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"]
看,马!没有正则表达式!