2

正規表現を完成させるためのアドバイスが必要です。1 つの式で文字列を 3 つの部分に分割しようとしています。行は、次のような形式のテキスト ファイルから取得されます。

25 red delicious apples at 0.75 

ここで、最初の部分は数量、2 番目は商品名、3 番目は商品ごとの価格です。私が使用しているコードは次のとおりです。

File.open('basket.txt').each_line do |line|
  item = line.split(/(\d+)\s|\sat\s/, 3)

これにより、必要な場所で文字列が分割されますが、長さ 4 のアイテム配列が作成されます (最初のインデックスには が含まれますnil)。フロートの最後にある改行文字も取り除きたいです。

4

6 に答える 6

4

これを試すことができます:

txt = "25 red delicious apples 0.75"
pattern = Regexp.new('(?<=\d)\s|\s(?=\d)')
puts txt.split(pattern)

またはirbを使用:

'25 red delicious apples 0.75'.split(/(?<=\d)\s|\s(?=\d)/)

「で」で:

'25 red delicious apples at 0.75'.split(/(?<=\d)\s|\sat\s(?=\d)/)

ループの例:

pattern = Regexp.new('(?<=\d)\s|\sat\s(?=\d)')
File.open('basket.txt').each_line do |line|
  items = line.split(pattern)
end
于 2013-10-24T07:59:14.253 に答える
2

このタスクには、分割の代わりに一致を使用します。これにより、グループをより正確に取得できます。たとえば、製品名に数字が含まれていないと仮定すると、次のようになります。

s = "25 red delicious apples 0.75"
m = s.match(/(\d+) ([^\d.]+) ([\d.]+)/)
m[1]
=> "25"
m[2]
=> "red delicious apples"
m[3]
=> "0.75"
于 2013-10-24T07:51:25.640 に答える
0
'25 red delicious apples at 0.75'.scan(/[0-9]+\.?\d*/) #=> ["25", "0.75"]
于 2013-10-24T09:07:21.733 に答える
0

どうですか:

'25 red delicious apples at 0.75'.scan /(\d+[.\d]+) (.*) at (\d+[.\d]+)/
#=> [["25", "red delicious apples", "0.75"]]
于 2013-10-24T11:01:42.753 に答える