2013-12-12 98 views
2

無可否認,我對RegEx和模式替換非常可怕,所以我想知道是否有人可以幫我解決這個問題,因爲我現在一直在嘗試幾個小時,把頭髮拉出來的過程。改變發生的東西到something_sum

例子:

sum(Sales) needs to be converted to Sales_sum 
max(Sales) needs to be converted to Sales_max 
min(Revenue) needs to be converted to Revenue_min 

唯一可用的前綴話會sum, min, max, avg, xcount - 不知道這使得該解決方案的差異。

希望這是足夠的信息來顯示我想要做的事情。這是可以通過RegEx嗎?

在此先感謝。

+0

...這不是複雜...更換'/(總和| MIN | MAX |($。*?)\)/ g' with'「$ 2_ $ 1」'... –

+0

所有相對的,因爲我與正則表達式可怕:) –

回答

3

有幾種可能的方式,例如:

var str = "min(Revenue)"; 
var arr = str.match(/([^(]+)\(([^)]+)/); 
var result = arr[2]+'_'+arr[1]; 

result然後"Revenue_min"

下面是一個更復雜的例子您的評論之後,處理許多比賽和lowercasing動詞:

var str = "SUM(Sales) + MIN(Revenue)"; 
var result = str.replace(/\b([^()]+)\(([^()]+)\)/g, function(_,a,b){ 
    return b+'_'+a.toLowerCase() 
}); 

結果:"Sales_sum + Revenue_min"

+0

這是否可以發展到包括所有發生循環結束?如SUM(銷售)+ SUM(銷售)。 –

+0

@ChrisDixon我編輯了我的答案 –

+0

絕對的天才。謝謝! –

1

嘗試用:

var input = 'sum(Sales)', 
    matches = input.match(/^([^(]*)\(([^)]*)/), 
    output = matches[2] + '_' + matches[1]; 

console.log(output); // Sales_sum 

另外:

var input = 'sum(Sales)', 
    output = input.replace(/^([^(]*)\(([^)]*)\)/, '$2_$1'); 
+0

第一個答案是否可以演變爲包括所有發生的循環?如SUM(銷售)+ SUM(銷售)。 –

0

使用白名單爲您的前綴詞表:

output = input.replace(/\b(sum|min|max|avg|xcount)\((.*?)\)/gi,function(_,a,b) { 
    return b.toLowerCase()+"_"+a; 
}); 

新增\b,一個字邊界。這可以防止像 「haxcount(xorz)」 成爲 「haxorz_xcount」

+0

這很好,但主要問題是SUM(銷售)不會被捕獲,如果它是然後SUM(銷售)將成爲Sales_SUM,它應該是Sales_sum - 抱歉。我應該在我的問題中說。 –

+0

已更新的答案。 –

1

您可以使用replace與令牌:

'sum(Sales)'.replace(/(\w+)\((\w+)\)/, '$2_$1') 
+0

這是我需要的最優雅的解決方案(儘管我仍然欣賞每個人的答案) - 是否有任何方法讓_之後的第二個單詞在這個正則表達式中小寫?即SUM(銷售)將成爲Sales_sum而不是Sales_SUM。 –