我对正则表达式感到困惑我认为当涉及到这些可怕的代码时,我会有阅读困难..无论如何,必须有一种更简单的方法来做到这一点 - (即在一行中列出一组替换实例) , 任何人?提前谢谢。
function clean(string) {
string = string.replace(/\@~rb~@/g, '').replace(/}/g, '@~rb~@');
string = string.replace(/\@~lb~@/g, '').replace(/{/g, '@~lb~@');
string = string.replace(/\@~qu~@/g, '').replace(/\"/g, '@~qu~@');
string = string.replace(/\@~cn~@/g, '').replace(/\:/g, '@~cn~@');
string = string.replace(/\@-cm-@/g, '').replace(/\,/g, '@-cm-@');
return string;
}
答案 0 :(得分:32)
您可以使用功能替换。对于每个匹配,函数决定应该替换它。
function clean(string) {
// All your regexps combined into one:
var re = /@(~lb~|~rb~|~qu~|~cn~|-cm-)@|([{}":,])/g;
return string.replace(re, function(match,tag,char) {
// The arguments are:
// 1: The whole match (string)
// 2..n+1: The captures (string or undefined)
// n+2: Starting position of match (0 = start)
// n+3: The subject string.
// (n = number of capture groups)
if (tag !== undefined) {
// We matched a tag. Replace with an empty string
return "";
}
// Otherwise we matched a char. Replace with corresponding tag.
switch (char) {
case '{': return "@~lb~@";
case '}': return "@~rb~@";
case '"': return "@~qu~@";
case ':': return "@~cn~@";
case ',': return "@-cm-@";
}
});
}
答案 1 :(得分:13)
您可以定义一个通用函数,如果您可以在代码的更多部分中重用它,那将是有意义的,从而使其成为DRY。如果你没有理由定义一个通用的,我只会压缩清除序列的部分,并保留其他部分替换它们。
function clean(string) {
string = string.replace(/\@~rb~@|\@~lb~@|\@~qu~@|\@~cn~@|\@-cm-@/g, '')
.replace(/}/g, '@~rb~@').replace(/{/g, '@~lb~@')
.replace(/\"/g, '@~qu~@').replace(/\:/g, '@~cn~@')
.replace(/\,/g, '@-cm-@');
return string;
}
但请注意,替换的顺序在此代码中已更改..虽然似乎但它们可能不会影响结果。
答案 2 :(得分:0)
你可以这样做:
function clean(str) {
var expressions = {
'@~rb~@': '',
'}': '@~rb~@',
// ...
};
for (var key in expressions) {
if (expressions.hasOwnProperty(key)) {
str = str.replace(new RegExp(key, 'g'), expressions[key]);
}
}
return str;
}
请记住,对象属性的顺序无法可靠地确定(但大多数实现将按定义的顺序返回它们)。如果您需要确保特定的订单,您可能需要这样的多个结构。
答案 3 :(得分:0)
你可以按顺序将它们全部链接起来。
function clean(string) {
return string.replace(/\@~rb~@/g, '').replace(/}/g, '@~rb~@')
.replace(/\@~lb~@/g, '').replace(/{/g, '@~lb~@')
.replace(/\@~qu~@/g, '').replace(/\"/g, '@~qu~@')
.replace(/\@~cn~@/g, '').replace(/\:/g, '@~cn~@')
.replace(/\@-cm-@/g, '').replace(/\,/g, '@-cm-@');
}
答案 4 :(得分:0)
......必须有一种更简单的方法 this-(即列出一组替换 一行中的实例)......
百胜,API首先思考。怎么样......?
var clean = multiReplacer({
"@~rb~@": "",
"@~lb~@": "",
"@~qu~@": "",
"@~cn~@": "",
"@-cm-@": "",
"}": "@~rb~@",
"{": "@~lb~@",
"\\": "@~qu~@",
":": "@~cn~@",
",": "@-cm-@"
});
水暖:
// From http://simonwillison.net/2006/Jan/20/escape/
RegExp.escape = function(text)
{
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
};
function multiReplacer(replacements)
{
var regExpParts = [];
for (prop in replacements)
{
if (replacements.hasOwnProperty(prop))
{
regExpParts.push(RegExp.escape(prop));
}
}
var regExp = new RegExp(regExpParts.join("|"), 'g');
var replacer = function(match)
{
return replacements[match];
};
return function(text)
{
return text.replace(regExp, replacer);
};
}