Javascript-Regex,用于删除前缀数组

Javascript - Regex to remove an array of prefixes

本文关键字:前缀 数组 删除 用于 Javascript-Regex      更新时间:2023-09-26

我需要从字符串中删除前缀。给定一个已知前缀的数组,我不知道字符串中会存在哪个前缀。将只存在一个前缀。

    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"。我该怎么做?

您可以不使用循环:

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字符,则需要对其进行转义。

您没有正确创建RegExp对象,请执行以下操作:

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

循环后,您还应该return data;

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

如果值始终是数字并且位于字符串末尾:

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

应该直接在字符串末尾捕获所有数字,而不需要进入复杂的循环和荒谬的正则表达式。

当然,对于多个值,只需在其中循环即可。

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/对于更复杂的例子(

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

我会根据前缀列表动态构建一个正则表达式,并将其替换为空字符串:

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"

如果性能是一个问题,并且您有将重复使用的不同前缀集,那么您也可以将该函数转换为生成器。

将变量字符串传递到regexp对象时需要小心。试试这样的东西:

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");