查找并替换字符串中的所有匹配项
Find and replace all matches in a string
我正在尝试创建一个过滤器来替换文章中的字符。
我想在字符串中找到所有匹配的元素并将它们替换为数组中的元素,但它不起作用。如何解决?
//string to replace -> ”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„
function charReplace(value) {
let desc = value;
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
for (let key in toReplace) {
desc.replace(key, toReplace[key]);
}
return desc;
}
解决方案 1
与.split(...).join(...)
:
// string to replace
const string = '”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„';
function charReplace(value) {
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
let desc = value;
for (const key of Object.keys(toReplace)) {
desc = desc.split(key).join(toReplace[key]);
}
return desc;
}
console.log(charReplace(string));
解决方案 2
迭代替换并使用 .replace(new RegExp(...))
:
替换它们
// string to replace
const string = '”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„';
function charReplace(value) {
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
let desc = value;
for (const entity of Object.keys(toReplace)) {
desc = desc.replace(new RegExp(entity, 'g'), toReplace[entity]);
}
return desc;
}
console.log(charReplace(string));
解决方案 3(可自定义替换)
加入替换并使用替换功能:
.replace(new RegExp(Object.keys(replacements).join('|'), 'g'), match => replacements[match])
// string to replace
const string = '”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„';
function replace(string, replacements) {
return string.replace(new RegExp(Object.keys(replacements).join('|'), 'g'), match => replacements[match]);
}
console.log(replace(string, {
'–': '–',
'”': '"',
'„': '"'
}));
这是我认为最短的。 不需要循环,你可以只使用replace()
You can specify a function as the second parameter. In this case, the
function will be invoked after the match has been performed.
像这样:
var str = "”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„";
str = str.replace(/(–)|(”)|(„)/g,(str, p1, p2, p3)=>{
if(p1) return "–";
if(p2 || p3 ) return '"';
});
console.log(str);
请记住该表达式,我们正在寻找 –
、 ”
和 „
的精确匹配,因此如果您有 „
表达式,则找不到一场比赛。
您可以将正则表达式与所有连接的键一起使用管道(正则表达式符号表示替代),并使用一个函数来替换,该函数将找到的键作为替换对象的键。
function charReplace(value) {
const toReplace = { '–': '–', '”': '"', '„': '"' };
return value.replace(
new RegExp(Object.keys(toReplace).join('|'), 'g'),
k => toReplace[k]
);
}
var string = "”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„";
console.log(charReplace(string));
如果您尝试使用字符串替换,它只会替换该字符串的第一个实例。如果您改用正则表达式,它将替换该字符串的所有匹配项。这应该相当简单并且正则表达式非常可读。我会做这样的事情:
const replacements = [
{ regex: /–/, replacement: '-' },
{ regex: /”/, replacement: '"' },
{ regex: /„/, replacement: '"' }
];
let newStr = '”Lorem ipsum dolor sit amet – consectetur...'; // Full str
replacements.forEach(set => {
newStr = newStr.replace(set.regex, set.replacement);
});
我没有测试上面的代码,但它的本质应该在你的函数中工作得很好。如果你想扩展它,只需扩展你的替换数组。
JS 替换函数 return 值,你应该赋值然后使用那个
let desc = value;
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
for (let key in toReplace) {
desc = desc.replace(key, toReplace[key]);
}
return desc;
希望对你有所帮助
我正在尝试创建一个过滤器来替换文章中的字符。
我想在字符串中找到所有匹配的元素并将它们替换为数组中的元素,但它不起作用。如何解决?
//string to replace -> ”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„
function charReplace(value) {
let desc = value;
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
for (let key in toReplace) {
desc.replace(key, toReplace[key]);
}
return desc;
}
解决方案 1
与.split(...).join(...)
:
// string to replace
const string = '”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„';
function charReplace(value) {
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
let desc = value;
for (const key of Object.keys(toReplace)) {
desc = desc.split(key).join(toReplace[key]);
}
return desc;
}
console.log(charReplace(string));
解决方案 2
迭代替换并使用 .replace(new RegExp(...))
:
// string to replace
const string = '”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„';
function charReplace(value) {
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
let desc = value;
for (const entity of Object.keys(toReplace)) {
desc = desc.replace(new RegExp(entity, 'g'), toReplace[entity]);
}
return desc;
}
console.log(charReplace(string));
解决方案 3(可自定义替换)
加入替换并使用替换功能:
.replace(new RegExp(Object.keys(replacements).join('|'), 'g'), match => replacements[match])
// string to replace
const string = '”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„';
function replace(string, replacements) {
return string.replace(new RegExp(Object.keys(replacements).join('|'), 'g'), match => replacements[match]);
}
console.log(replace(string, {
'–': '–',
'”': '"',
'„': '"'
}));
这是我认为最短的。 不需要循环,你可以只使用replace()
You can specify a function as the second parameter. In this case, the function will be invoked after the match has been performed.
像这样:
var str = "”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„";
str = str.replace(/(–)|(”)|(„)/g,(str, p1, p2, p3)=>{
if(p1) return "–";
if(p2 || p3 ) return '"';
});
console.log(str);
请记住该表达式,我们正在寻找 –
、 ”
和 „
的精确匹配,因此如果您有 „
表达式,则找不到一场比赛。
您可以将正则表达式与所有连接的键一起使用管道(正则表达式符号表示替代),并使用一个函数来替换,该函数将找到的键作为替换对象的键。
function charReplace(value) {
const toReplace = { '–': '–', '”': '"', '„': '"' };
return value.replace(
new RegExp(Object.keys(toReplace).join('|'), 'g'),
k => toReplace[k]
);
}
var string = "”Lorem ipsum dolor sit amet – consectetur adipiscing elit. Suspendisse vitae augue ornare, ultricies ligula at, tempor felis – aenean ac placerat turpis. Nullam finibus lacus sit amet tortor consequat, venenatis malesuada eros volutpat. Proin varius nibh sit amet urna lobortis placerat. Donec rhoncus nibh vitae ultricies rutrum. Curabitur porta nisi eu rhoncus pulvinar. Nulla sit amet sollicitudin odio. Aliquam mi odio, malesuada ac arcu vitae, bibendum convallis risus.„";
console.log(charReplace(string));
如果您尝试使用字符串替换,它只会替换该字符串的第一个实例。如果您改用正则表达式,它将替换该字符串的所有匹配项。这应该相当简单并且正则表达式非常可读。我会做这样的事情:
const replacements = [
{ regex: /–/, replacement: '-' },
{ regex: /”/, replacement: '"' },
{ regex: /„/, replacement: '"' }
];
let newStr = '”Lorem ipsum dolor sit amet – consectetur...'; // Full str
replacements.forEach(set => {
newStr = newStr.replace(set.regex, set.replacement);
});
我没有测试上面的代码,但它的本质应该在你的函数中工作得很好。如果你想扩展它,只需扩展你的替换数组。
JS 替换函数 return 值,你应该赋值然后使用那个
let desc = value;
const toReplace = {
'–': '–',
'”': '"',
'„': '"'
};
for (let key in toReplace) {
desc = desc.replace(key, toReplace[key]);
}
return desc;
希望对你有所帮助