Javascript:将许多正则表达式.replace()简化为更少的正则表达式调用
我有下面的javascript函数,它使用了很多正则表达式。有什么方法可以简化这一点吗Javascript:将许多正则表达式.replace()简化为更少的正则表达式调用,javascript,regex,Javascript,Regex,我有下面的javascript函数,它使用了很多正则表达式。有什么方法可以简化这一点吗 function encode(str){ if(typeof str==='number'){ return str; } if(typeof str!=='string'){ return ''; } var enc=str; enc=enc.replace(/_/g,'_u'); //underscore enc=
function encode(str){
if(typeof str==='number'){
return str;
}
if(typeof str!=='string'){
return '';
}
var enc=str;
enc=enc.replace(/_/g,'_u'); //underscore
enc=enc.replace(/(\r\n|\r|\n)/g,'_r'); //return
enc=enc.replace(/&/g,'_a'); //ampersand
enc=enc.replace(/\\/g,'_b'); //backslash
enc=enc.replace(/:/g,'_c'); //colon
enc=enc.replace(/"/g,'_d'); //double quote
enc=enc.replace(/=/g,'_e'); //equals
enc=enc.replace(/€/g,'_4'); //euro
enc=enc.replace(/\>/g,'_g'); //greater than
enc=enc.replace(/#/g,'_h'); //hash
enc=enc.replace(/'/g,'_i'); //inverted comma
enc=enc.replace(/\</g,'_l'); //less than
enc=enc.replace(/¬/g,'_n'); //not
enc=enc.replace(/\|/g,'_1'); //pipe
enc=enc.replace(/¦/g,'_2'); //broken pipe
enc=enc.replace(/\+/g,'_p'); //plus
enc=enc.replace(/£/g,'_3'); //pound
enc=enc.replace(/\?/g,'_q'); //question mark
enc=enc.replace(/\//g,'_s'); //slash
enc=enc.replace(/\~/g,'_t'); //tlide
enc=enc.replace(/\`/g,'_z'); //back quote
enc=enc.replace(/\s/g,'_0'); //space
enc=enc.replace(/[\u0000-\u001f]/g,'');
return enc;
};
函数编码(str){
如果(str的类型=='number'){
返回str;
}
如果(str的类型!=='string'){
返回“”;
}
var-enc=str;
enc=enc.replace(/g/g,“u”);//下划线
enc=enc.replace(/(\r\n |\r |\n)/g,“u r');//返回
enc=enc.replace(//&/g,“u a”);//符号与
enc=enc.replace(/\\/g,“u b”);//反斜杠
enc=enc.replace(/:/g,“u c”);//冒号
enc=enc.replace(/“/g,”“d”);//双引号
enc=enc.replace(//=/g,“e”);//等于
enc=enc.replace(/€/g,“_4”);//欧元
enc=enc.replace(//\>/g,“u g”);//大于
enc=enc.replace(/#/g,“#h”);//散列
enc=enc.replace(//'/g,“_i');//倒逗号
enc=enc.replace(/\您可以执行以下操作:
var map = {
"_": "_u",
"(\r\n|\r|\n)": "_r",
"&": "_a",
/* .. etc .. */
};
var i;
var enc = "_abc&";
for (i in map) {
enc = enc.replace(new RegExp(i, "g"), map[i]);
}
console.log(enc); // _uabc_a
我使用了new RegExp
,因为您无法编写正则表达式。请记住,您不需要分隔符(/
),修饰符(g
)在其他地方。您可以这样做:
var map = {
"_": "_u",
"(\r\n|\r|\n)": "_r",
"&": "_a",
/* .. etc .. */
};
var i;
var enc = "_abc&";
for (i in map) {
enc = enc.replace(new RegExp(i, "g"), map[i]);
}
console.log(enc); // _uabc_a
我使用了new RegExp
,因为您无法编写正则表达式。请记住,您不需要分隔符(/
),修饰符(g
)在其他地方。您可以创建从“string to replace”到“replacement”的映射,而不是创建“pattern”到“replacement”的映射,然后使用带有回调的单个替换函数:
var map = {
"_": "_u",
"\r\n": "_r",
"\r": "_r",
"\n": "_r",
"&": "_a",
/* .. etc .. */
};
enc = enc.replace(
/\r\n|[_\r\n&\\:"=€>#'<¬|¦+£?\/~`\s\u0000-\u001f]/g,
function(m) {
return map[m[0]];
}
);
var映射={
“u”:“u”,
“\r\n”:“\r”,
“\r”:“\r”,
“\n”:“\r”,
“&”:“_a”,
/*……等等*/
};
enc=enc.replace(
/\r\n |[\r\n&\\:“=€>\\”您可以创建从“要替换的字符串”到“替换”的映射,而不是创建“模式”到“替换”的映射,然后使用带有回调的单个替换函数:
var map = {
"_": "_u",
"\r\n": "_r",
"\r": "_r",
"\n": "_r",
"&": "_a",
/* .. etc .. */
};
enc = enc.replace(
/\r\n|[_\r\n&\\:"=€>#'<¬|¦+£?\/~`\s\u0000-\u001f]/g,
function(m) {
return map[m[0]];
}
);
var映射={
“u”:“u”,
“\r\n”:“\r”,
“\r”:“\r”,
“\n”:“\r”,
“&”:“_a”,
/*……等等*/
};
enc=enc.replace(
/\r\n |[\r\n&\\:”=€>#“最终你的情况是什么。你想用你的东西替换所有的特殊字符。不是吗?为什么你想更改它?你应该用一些例子描述你想正则表达式做什么…然后有人会帮助你。@AshBurlaczenko我只想知道这是否可以简化?所有的替换调用都可以吗合并成一个?@d'alar'cop我只是想把任何字符串编码成这种独特的格式,所以'10change'
会变成'u 310_s_a_s_hchange'
。最终你的条件是什么。你想用你的东西替换所有的特殊字符。不是吗?你为什么要更改它?你应该描述一下你想要什么规则用英语做一些例子…然后有人会帮助你。@Ashburaczenko我只是想知道这是否可以简化?所有的替换调用可以合并成一个吗?@d'alar'cop我只是想把任何字符串编码成这种独特的格式,所以“.10change”
会变成“\u 310\u s\u hchange”
,这不是同一个吗正则表达式调用的数量,只是在for循环中?是的。我看不到其他优化方法,所以我想你是这个意思。好的,谢谢。我想看看是否可以优化这个,但如果我不能,那么这就回答了我的问题。@Jimmery看到了对我答案的编辑。这种方法实际上快了一倍。@m.buettner我刚刚用jsPerf和separa运行了测试te替换更快?我运行的是Firefox 24.0,这不是相同的正则表达式调用数,只是在for循环中吗?是的。我看不到其他优化方法,所以我想你是这么想的。好的,谢谢。我想看看我是否可以优化这个,但如果我不能,那就回答了我的问题。@Jimmey看到了对我答案的编辑。这种方法实际上是一年两次s fast.@m.buettner我刚刚在jsPerf中运行了测试,显然单独的替换速度更快?我运行的是Firefox 24.0+1。我很好奇,如果map{}
对象直接放在回调函数中(作为匿名对象文本),这个解决方案是否会变慢?例如s.replace(/[&]/g,函数(m){return return{“”,“&”:“&;”}[m];})
@ridgerunner在生产代码中,我实际上会将map
拉得更远,使其成为“全局的”,这样就不必每次有人调用encode
+1时都创建它。我很好奇,如果将map{/code>对象直接放在回调函数中,这个解决方案是否会变慢(作为一个匿名对象文字)?例如,s.replace(/[&]/g,函数(m){return{“:”,“&”:“&;”}[m];})
@ridgerunner在生产代码中,我实际上会将映射进一步拉出来,使其成为“全局的”,这样就不必每次有人调用encode
时都创建它。