简体   繁体   English

查找并替换字符串中的所有匹配项

[英]Find and replace all matches in a string

I'm trying to create a filter to replace characters in articles. 我正在尝试创建一个过滤器来替换文章中的字符。

I want to find all matching elements in a string and replace them with an element from an array, but it doesn't work. 我想在字符串中找到所有匹配的元素,并用数组中的元素替换它们,但这不起作用。 How to fix it? 如何解决?

 //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; } 

This is I think the shortest. 我认为这是最短的。 There is no need of loop , you could use just replace() 不需要循环 ,您可以只使用replace()

You can specify a function as the second parameter. 您可以将函数指定为第二个参数。 In this case, the function will be invoked after the match has been performed. 在这种情况下,将在执行匹配后调用该函数。

like this: 像这样:

 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); 

Keep in mind in that expression, we are looking for exact match of – 请记住该表达式,我们正在寻找–完全匹配 , ” ” and „ „ so if you have &#8222 expression did't find a match. 因此,如果您具有&#8222表达式,则找不到匹配项。

You could use a regular expression with all joined keys with pipe (the regular expressions sign for alternative) and take for replacent a function which takes the found key as key for the replacement object. 您可以将正则表达式与所有带有管道的连接键一起使用(正则表达式对替代符号进行签名),并为replacent提供一个函数,该函数将找到的键作为替换对象的键。

 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)); 

If you try to replace using a string, it'll only replace the first instance of that string. 如果您尝试使用字符串进行替换,则只会替换该字符串的第一个实例。 If you use regex instead it'll replace all matches of that string. 如果使用regex,它将替换该字符串的所有匹配项。 This should be fairly simple and regex is very readable. 这应该相当简单,并且正则表达式非常易读。 I would do something like this: 我会做这样的事情:

const replacements = [
    { regex: /–/, replacement: '-' },
    { regex: /”/, replacement: '"' },
    { regex: /„/, replacement: '"' }
];

let newStr = '”Lorem ipsum dolor sit amet &#8211 consectetur...'; // Full str
replacements.forEach(set => {
    newStr = newStr.replace(set.regex, set.replacement);
});

I've not tested the above code, but the essence of it should work just fine within your function. 我没有测试上面的代码,但是它的本质在您的函数中应该可以正常工作。 If you want to expand it, simply expand your replacements array. 如果要扩展它,只需扩展您的替换数组。

JS replace function return value and you should assign value then use that JS替换函数返回值,您应该分配值,然后使用该值

          let desc = value;
            const toReplace = {
                '–': '–',
                '”': '"',
                '„': '"'
            };
            for (let key in toReplace) {
                desc = desc.replace(key, toReplace[key]);
            }
            return desc;

I hope it will help you. 希望对您有帮助。

Solution 1 解决方案1

With .split(...).join(...) : 使用.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)); 

Solution 2 解决方案2

With iterating over the replacements and replace them using .replace(new RegExp(...)) : 遍历替换并使用.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)); 

Solution 3 (customizable replacements) 解决方案3(可定制的替代品)

With joining the replacements and use a replacer function: 加入替换并使用替换功能:

.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, { '–': '–', '”': '"', '„': '"' })); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM