我想将'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。答案 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。将字符串转换为数组,然后连接元素以形成字符串不是一个好的解决方案,但如果你讨厌正则表达式 - ))