我需要从字符串中删除前缀。给定一个已知前缀的数组,我不知道字符串中会存在哪个前缀。将只存在一个前缀。
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");