2011-08-23 76 views
1

我需要从字符串中移除前缀。给定一个已知的前缀数组,我不知道字符串中会存在哪个前缀。一个且只有一个前缀将存在。Javascript - 正则表达式来移除前缀数组

function CleanupSupportedItems(data) { 
     var prefixes = new Array("TrialLeads", "IPG"); 

     for (var i = 0; i < prefixes.length - 1; i++) { 
      var prefix = new RegExp(/prefixes[i]/g); 
      //alert(prefix); 
      data = data.replace(prefix, ""); 
      alert(data); 
     } 
    } 

上述代码在第二次迭代时返回undefined。

鉴于呼叫

CleanupSupportedItems("TrialLeads11"); 

我希望 “11” 的返回值。我该怎么做?

+0

如果结果值是数字,那么过滤出来会更容易...... – sg3s

+0

@ sg3s - 是的返回值将始终为数字。因此,无论您对此类改进有何建议,都是值得欢迎的。 –

回答

4

你可以不使用循环:

function CleanupSupportedItems(data) { 
    var prefixes = new Array("TrialLeads", "IPG"); 

    var prefix = new RegExp('^(' + prefixes.join('|') + ')', "g"); 
    data = data.replace(prefix, ""); 
    alert(data); 
} 

CleanupSupportedItems("TrialLeads11"); // alerts 11 
CleanupSupportedItems("IPG12"); // alerts 12 

这里的演示:http://jsfiddle.net/mrchief/KkRFp/

更新,以确保它取代前缀,而不是在身体之间。感谢minitech指出。

作为一个建议的改进,如果输入的前缀预计有Regex Special characters,则需要将其转义。

+0

哦,我喜欢你使用join来解决我在我的回答中提到的问题:) +1。你应该'返回数据;'我想。 – Paulpro

+0

@PaulPRO:我刚刚修改了OP的代码。他可以做任何事情,因为他的原始问题现在已经确定。 :) – Mrchief

+0

加入和新的正则表达式,不错的把戏+1 – amosrivera

1
RegExp.escape = function(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
}; 

if(![].map) Array.prototype.map = function(f) { var r = [], i; for(i = 0; i < this.length; i++) r.push(f(this[i])); return r; }; 

function CleanupSupportedItems(data) { 
    var prefixes = ["TrialLeads", "IPG"]; 

    return data.replace(new RegExp('^(' + prefixes.map(RegExp.escape).join('|') + ')'), ''); // this line changed 
} 

应该做的工作。它的作用:http://jsfiddle.net/minitech/XZwLU/(和http://jsfiddle.net/minitech/XZwLU/1/一个更复杂的例子)

编辑:我只注意到你说只会有一个前缀,在这一问题。现在已经解决了。

2

你没有正确地创建RegExp对象,而是执行此操作:

var prefix = new RegExp('^'+prefixes[i], 'g'); 

循环后还你应该return data;

请注意,如果你有一个像“TrailheadsIPG11”,该字符串结果将是'11',因为当替换成功时您不退出循环,并且如果您的前缀数组包含任何字符()[]{}.*+?或在像\d \w \s等正则表达式中具有特殊含义的序列,则它们将被视为正则表达式,而不是字符。如果你想保存这个功能,你可以跳过你的字符,如\.而不是.

+0

也可以替换所有实例,而不仅仅是一个实例,不管字符串中的位置如何,并且不能转义特殊字符,甚至是基本标点符号。 – Ryan

+0

@minitech这就是它的意思:) – Paulpro

+0

@minitech oh nevermind,我现在明白了。我加了'^'使它只匹配字符串的开头。我认为标点符号不需要转义,因为OP的前缀数组不包含任何标点符号。他可能会提到前缀数组是否可以包含任何特殊的正则表达式字符 – Paulpro

1

我会动态地构建一个基于正则表达式的前缀列表上,并用空字符串替换它们:

function trimPrefixes(s, ps) { 
    return (""+s).replace(new RegExp('^(' + ps.join('|') + ')'), ''); 
} 
// For example... 
trimPrefixes("Foo123", ['Foo', 'Bar']); // => "123" 
trimPrefixes("Barzip", ['Foo', 'Bar']); // => "zip" 
trimPrefixes("I'm ok", ['Foo', 'Bar']); // => "I'm ok" 

你也可以把这一功能变成一台发电机,如果性能是一个问题,你已经有了不断变化的将被重复使用的前缀集合。

+0

忘记逃跑了... – Ryan

-1

将变量字符串传递给正则表达式对象时,您需要小心。 尝试是这样的:

function CleanupSupportedItems(data) { 
    var prefixes = new Array("TrialLeads", "IPG"); 

    for (var i = 0; i < prefixes.length - 1; i++) { 

     var prefix = new RegExp(prefixes[i], "g"); 
     //alert(prefix); 
     data = data.replace(prefix, ""); 
    } 
       alert(data); 
} 

CleanupSupportedItems("TrialLeads11"); 
+0

再一次,没有逃脱,将取代字符串中的任何地方。 – Ryan

1

如果该值始终是数字和字符串的结尾:

var int = string.match(/[\d]+$/); 
if(typeof int != 'undefined') 
{ 
    // There should be a valid (numeric) match in int at this point 
} 

应该捕获所有直接对字符串的结尾号码没有进入复杂循环和荒谬的正则表达式。

对于多个值的课程只是循环通过它们在里面。