2013-12-12 48 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。 –