2016-07-26 115 views
0

我需要分割的字符串,食品,比如「巧克力餅乾200克」紅寶石 - 將一個字符串分解提取號碼和測量/重量,然後再轉換numberFo

我需要提取「200克「從字符串,然後按數字分割,然後按測量/重量分割。

所以我需要單獨的「200」和「g」。

我已經寫了一個Ruby的正則表達式來查找字符串的「200克」(有時可出現數量和測量值之間的空間,所以我已經包括他們之間的可選的空格):

([0-9]*[?:\s ]?[a-zA-Z]+) 

我認爲它有效。但是現在我得到了與整個String匹配的結果(「200g」),我需要通過數字和度量來分割它。 我寫了兩個正則表達式來分割這些:

([0-9]+) 

由數分裂和

([a-zA-Z]+) 

用字母來分割。

但.split方法不適用於這些。 我得到以下錯誤:

undefined method 'split' for #MatchData "200" 

當然,我需要將200轉換爲數字而不是字符串。

任何幫助,非常感謝, 謝謝!

更新: 我測試了3個正則表達式http://www.rubular.com/

我的問題似乎是圍繞第一個正則表達式的結果拆分爲數字和度量。

+0

並不清楚'([0-9] * [:\ s]的? [a-zA-Z] +)'。沒有號碼可以嗎?你爲什麼想要一個問號或冒號? '\ s'和''之間的替代是多餘的。 – sawa

+0

它尋找任意數量的數字,可選地後跟一個空格,然後是任意數量的字母 [?:\ s]部分用於可選空白,我發現它在不同的線程中具有可選值正則表達式。 – user098123

+0

謝謝。我早些時候看過一次,但是它並不能幫助我分割最初的正則表達式的結果。 – user098123

回答

1

許多方法之一是使用String#scan與正則表達式。請參閱文件最後一句關於捕獲小組的處理。

str = "Chocolate Biscuits 200g" 

r =/
    (\d+)   # match one or more digits in capture group 1 
    ([[:alpha:]]+) # match one or more alphabetic characters in capture group 2 
    /x    # free-spacing regex definition mode   

number, weight = str.scan(r).flatten 
    #=> ["200", "g"] 
number = number.to_i 
    #=> 200 
+0

謝謝,我認爲這似乎工作! :) 非常感謝您的幫助! – user098123

0

我不是紅寶石的專家,但我想,下面的代碼不會交易

myString = String("Chocolate Biscuits 200g"); 

weight = 0; 

unit = String(''); 

stringArray = myString.split(/(?:([a-zA-Z]+)|([0-9]+))/); 

stringArray.each{ 
    |val| 
    if val =~ /\A[0-9]+\Z/ 

     weight = val.to_i; 
    elsif weight > 0 and val.length > 0 

     unit = val; 
    end 
} 

p weight; 

p unit;