如何根据某些单词拆分字符串

时间:2017-05-16 09:46:20

标签: ruby split

我想将'START'分隔一个字符串,可选择用空格包围。例子:

params['body'] = 'START88'
# => command = 'START', service = '88'

params['body'] = 'START 88'
# => command = 'START', service = '88'

我试过了:

command, service = params['body'].downcase.strip.split(' ')

但我不确定如何包含单词而不是空格。

编辑:可能我还添加服务并不总是数字,因此很容易成为'STARTSERVICE'。但是,命令数量有限:START,STOP,SUB,UNSUB。

4 个答案:

答案 0 :(得分:2)

您可以将match与命名捕获一起使用,例如:

example_arr = ['START88', 'START 88', 'start 88', 'STOP 99']
matcher = /(?<command>start|stop)\s*(?<service>\d*)/i
example_arr.map { |line| line.match matcher }

#=> [#<MatchData "START88" command:"START" service:"88">, 
     #<MatchData "START 88" command:"START" service:"88">, 
     #<MatchData "start 88" command:"start" service:"88">, 
     #<MatchData "STOP 99" command:"STOP" service:"99">]

这只是一个例子,在你的情况下它会是这样的:

params['body'] = 'START88'
command, service = params['body'].match(matcher).captures

> command
#=> "START"
> service
#=> "88"

答案 1 :(得分:1)

正则表达式是你的朋友。只需传递您想要拆分的单词(例如停止),您也可以使用i,这样您就不需要进行缩写:

command, service = params['body'].split(/(stop)/i)

一个更好的例子:

words = %w(stop start)
your_string = 'stop88 start 88'

your_string.gsub!(/\s+/, "") # remove whitespaces
your_string.split(/(#{words.join('|')})/i).reject(&:empty?)
=> ["stop", "88", "start", "88"]

/(#{words.join('|')})/i在此示例中转换为/(stop|start)/i

  • 获取您想要拆分的单词数组,并将其与|连接,这意味着它与其中任何一个匹配
  • 应用()来包含匹配项。
  • /i表示它不区分大小写
  • reject(&:empty?)只删除空字段(如果有)

答案 2 :(得分:1)

['START88', 'START 88'].map { |w| w.scan(/(\w+)\s*(\d+)/) }
#⇒ [['START', '88'], ['START', '88']]

答案 3 :(得分:0)

对于给定的字符串,您还可以提取没有正则表达式的数字和字母

a = "START88"
a.chars.select{|e| e.chr.to_i != 0 }.join("")
#=> "88"
# you can also use reject if != is not for you -))
#a.chars.select{ |e| e.chr.to_i != 0 }.join("").to_i
#=> 88
a.chars.select{ |e| e.chr.to_i == 0 }.join("")
#=> "START"

P.S。将字符串转换为数组,然后连接元素以形成字符串不是一个好的解决方案,但如果你讨厌正则表达式 - ))