2016-03-28 38 views
0

パラメータの後にあるものすべてを入力から抽出する必要があります。文字列内の部分文字列

  • 入力:"-a Apple -b Ball -c Chocolate"
  • 基準:-c後にすべてのものを抽出する必要があります。

私の出力はChocolateである必要があります。私はsplitscanを試して、出力は2つの要素を返しました。誰もがこの要件を私を助けることができますか?

また、私の入力が"-a Apple -c Chocolate -b Ball"であるかどうかの処理方法を教えてください。

+1

だから、「'のために"アップル-cチョコレート-bボール" '、' 'チョコレート-bボール' '(' -c'の後ろのもの)、そうでしょうか? – sawa

+0

番号。私の入力が「-a Apple -c Chocolate -b Ball」の場合、私はまだチョコレートとして-c値だけを読みたいと思っていました。私の懸念は、入力文字列の-cパラメータの位置でした。 – Venkat

+0

これは、 '-c'の後のすべてではありません。 – sawa

答えて

0

しようと、入力はRubyスクリプトに渡されたコマンドライン引数であると仮定すると:

ARGV[ARGV.index("-c") + 1]

説明:

ARGVrubyスクリプトに渡されたすべての引数が含まれてarrayです。 Array#indexは、自己の最初のオブジェクトのインデックスを返します。

詳細については、Array#indexを参照してください。

1

あなたは本当に、マーカーの後にすべてのもの(-c)場合:あなたは引数を解析したい場合は

s = "-a Apple -b Ball -c Chocolate" 
index = s.index('-c') 
everything_after = s[(index + 2)..-1] 
puts everything_after # => Chocolate 

を:

は 'optparseは'

opts = OptionParser.new do |parser| 
    parser.on('-a=s') do |v| 
    end 
    parser.on('-b=s') do |v| 
    end 
    parser.on('-c=s') do |v| 
    puts "-c is #{v}" 
    end 
end 

opts.parse("-a Apple -b Ball -c Chocolate".split(/\s/)) 

(あなたは意志が必要ですすべてのフラグを指定する必要があります。そうでなければ、パーサーはチョークします)

Regexpを使ってコンテンツを再生する 私はあなたが探していると思う:<> < FLAG ANYTHING> < ANYTHING BUT < FLAG>はあなたがこれを行うにOptionParserライブラリを使用することができます

s.match(/\A.*-c\s([^-]*).*\z/) do |match| 
    p match[1] 
end 
2

'-c' であるDASH> < ANYTHING>:

require 'optparse' 

arguments = { } 

opts = OptionParser.new do |parser| 
    parser.on('-a=s') do |v| 
    arguments[:a] = v 
    end 
    parser.on('-b=s') do |v| 
    arguments[:b] = v 
    end 
    parser.on('-c=s') do |v| 
    arguments[:c] = v 
    end 
end 

opts.parse("-a Apple -b Ball -c Chocolate".split) 

arguments 
# => {:a=>"Apple", :b=>"Ball", :c=>"Chocolate"} 

これは動作の仕方が非常に柔軟なので、多くのオプションとその解釈方法を定義できます。

0
s = "-a Apple -b Ball -c Chocolate" 

一つの方法:これらのマーカーのいずれかの正規表現を考えてみましょう

`\K` in the regex below means "forget everything matched so far". 

marker = "-c" 
s[/#{marker}\s+\K.*/] 
    #=> "Chocolate" 

marker = "-b" 
s[/#{marker}\s+\K.*/] 
    #=> "Ball -c Chocolate" 

marker = "-a" 
s[/#{marker}\s+\K.*/] 
    #=> "Apple -b Ball -c Chocolate" 

正規表現を使用します。

marker = "-c" 
s[s.index(marker)+marker.size+1..-1] 
    #=> "Chocolate" 

marker = "-b" 
s[s.index(marker)+marker.size+1..-1] 
    #=> "Ball -c Chocolate" 

marker = "-a" 
s[s.index(marker)+marker.size+1..-1] 
    #=> "Apple -b Ball -c Chocolate" 

別の方法を指数を計算。

marker = "-a" 
r =/
    #{marker} # match the contents of the variable 'marker' 
    \s+   # match > 0 whitespace chars 
    \K   # forget everything matched so far 
    .*   # match the rest of the line 
    /x   # free-spacing regex definition mode 
    #=>/
    # -a   # match the contents of the variable 'marker' 
    # \s+   # match > 0 whitespace chars 
    # \K   # forget everything matched so far 
    # .*   # match the rest of the line 
    # /x 
s[r] 
    #=> "Apple -b Ball -c Chocolate" 

しかし、あなたが本当にマーカー

間のテキストだけをしたい場合、私は、値としてキーやテキストなどのマーカーでハッシュを構築します。まず、次の正規表現を使用して文字列を分割します。

r =/
     \s*  # match >= 0 spaces 
     \-  # match hypen 
     (  # begin capture group 1 
     [a-z] # match marker 
    )  # end capture group 1 
     \s* # match >= 0 spaces 
     /x  # free-spacing regex definition mode 

h = s.split(r).drop(1).each_slice(2).to_h 
    #=> {"a"=>"Apple", "b"=>"Ball", "c"=>"Chocolate"} 

このハッシュでは、各マーカーのテキストを取得できます。

h["a"] 
    #=> "Apple" 
h["b"] 
    #=> "Ball" 
h["c"] 
    #=> "Chocolate" 

ハッシュを作成する手順は次のとおりです。正規表現でキャプチャグループ内[a-z]を置くことによって、"a""b""c"をアレイaに含まれ、

a = s.split(r) 
    #=> ["", "a", "Apple", "b", "Ball", "c", "Chocolate"] 

注意。 (。String#split、第三段落を参照してください)

b = a.drop(1) 
    #=> ["a", "Apple", "b", "Ball", "c", "Chocolate"] 
c = b.each_slice(2) 
    #=> #<Enumerator: ["a", "Apple", "b", "Ball", "c", "Chocolate"]:each_slice(2)> 

我々は、配列に変換することにより、列挙子cの要素を見ることができます:

c.to_a 
    #=> [["a", "Apple"], ["b", "Ball"], ["c", "Chocolate"]] 

最後に、

c.to_h 
    #=> {"a"=>"Apple", "b"=>"Ball", "c"=>"Chocolate"} 
関連する問題