Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:将许多正则表达式.replace()简化为更少的正则表达式调用_Javascript_Regex - Fatal编程技术网

Javascript:将许多正则表达式.replace()简化为更少的正则表达式调用

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=

我有下面的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=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我只是想把任何字符串编码成这种独特的格式,所以
'10&#change'
会变成
'u 310_s_a_s_hchange'
。最终你的条件是什么。你想用你的东西替换所有的特殊字符。不是吗?你为什么要更改它?你应该描述一下你想要什么规则用英语做一些例子…然后有人会帮助你。@Ashburaczenko我只是想知道这是否可以简化?所有的替换调用可以合并成一个吗?@d'alar'cop我只是想把任何字符串编码成这种独特的格式,所以
“.10&#change”
会变成
“\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
时都创建它。