2017-04-11 21 views
0

我有以下字符串:分裂此字符串使用JavaScript或紅寶石

Upper and lower ranch milk 125ML (3 * 8) 

和1000其它類似的那些是相同的格式的不。我想將產品(文本部分),卷(125ML)和排序規則((3 * 8))分隔爲單獨的變量。

我試着用excel和matlab來想出一個函數,但還沒有設法達到預期的結果。我想提出一個聰明的方法來做到這一點,而不是手動篩選每一個。所有的輸入讚賞。

+0

你可以找到第一個'('的索引,然後建立一個子串。那麼如果你用空格分割那個子串,你就知道數量是最後一個元素,其他的一切都是這個名字的一部分。然後你可以得到奇怪的支架的東西。 ---它有點不潔,但它會工作。 – byxor

+0

只需從您的輸入中提供三個隨機樣本和相應的期望輸出。 – mvw

+0

'javascript' /'ruby' /'matlab'它應該是哪一個? –

回答

6

可以使用正則表達式,例如^(.*)(\d+ML) +\((.*)\)

說明

^(.*)組1:從開始的任何字符

(\d+ML)第2組:阿空間,隨後在數字的體積和ML

+\((.*)\)第3組:至少有一個空格後的括號之間的任何內容

適用於您的樣本字符串

全場比賽Upper and lower 2 ranch milk 125ML (3 * 8)

組1:Upper and lower 2 ranch milk

組2:125ML

第3組:3 * 8

Demo

示例代碼段在JavaScript

看控制檯

function extractInformation(from) { 
 
\t var re = /^(.*)(\d+ML) +\((.*)\)/; 
 
\t var matches = re.exec(from); 
 
\t if(matches) { 
 
\t \t return { 
 
\t \t \t "title" : matches[1].trim(), 
 
\t \t \t "volume": matches[2].trim(), 
 
\t \t \t "collation": matches[3].trim(), 
 
\t \t } 
 
\t } 
 
\t return {}; 
 
} 
 

 
console.log(extractInformation("Upper and lower ranch milk 125ML (3 * 8)")); 
 
console.log(extractInformation("Upper and lower 123 ranch milk 125ML (3 * 8)"))

+0

在演示中,每行只有1組。我誤解了嗎? – byxor

+0

沒有每行都有3組。我更新了正則表達式,因此標題也可以包含數字 –

+0

謝謝!這對大多數線條都是完美的,有些完全搞砸了,所以不適合這個。現在將excel表單轉換爲ruby數組並運行它。非常感謝! – theoneinskane

1

不是一個很好的解決方案,但可能保存一天(JavaScript的)。

var str = "Upper and lower ranch milk 125ML (3 * 8)"  
f = str.match(/\d+ML/g)[0] 
//"125ML" 
[x,y] = str.split(f) 
//Array [ "Upper and lower ranch milk ", " (3 * 8)" ] 
x 
//"Upper and lower ranch milk " 
y 
//" (3 * 8)" 
1

在Ruby中,你只需要拆分周圍的一些數字,然後ML

text = "Upper and lower ranch milk 125ML (3 * 8)" 
p text.split(/\s+(\d+ML)\s+/) 
# ["Upper and lower ranch milk", "125ML", "(3 * 8)"] 

split參數通常沒有在列表中返回,除非你定義一個組(與正則表達式中的())。

要解析您的Excel文件,將電子表格導出爲CSV文件並使用CSV class解析它可能會更容易。

+0

我在ruby代碼中看到一個錯誤,該錯誤代碼是未定義的方法 – theoneinskane

+0

@theoneinskane:'split'已經是一個String方法長達數十年了。你試圖用哪個對象? –

+0

我知道,我試圖將它應用於CSV文件的行,就像這樣:'require'csv' CSV.foreach('prodName.csv')do | row | puts row.split(/ \ s +(\ d + ML)\ s + /) end' – theoneinskane

1
"Upper and lower ranch milk 125ML (3 * 8)".partition(/\d+ML/) 
# => ["Upper and lower ranch milk ", "125ML", " (3 * 8)"] 

"Upper and lower ranch milk 125ML (3 * 8)".partition(/\d+ML/).map(&:strip) 
# => ["Upper and lower ranch milk", "125ML", "(3 * 8)"]