regex 如何在JavaScript中删除字符串中除某些子字符串(以列表形式给出)之外的所有字符?

qvtsj1bj  于 2022-12-27  发布在  Java
关注(0)|答案(3)|浏览(111)

在JavaScript中,我们假设有一个字符串:“敏捷的棕色狐狸跳过懒惰的狗”
然后我们有一个子字符串列表,比如:[“狗”、“棕色”、“那个”、“跳”]
如何过滤字符串中的每隔一个字符,而不是列表中给出的子字符串?
因此,本例中的结果应为:“棕色跳跃狗”
我想到的第一个解决方案是使用一个循环,并在每次迭代中使用RegExp,即:

const listOfSubstrings = ["dog", "brown", "The", "jumps"];
let theString = "The quick brown fox jumps over the lazy dog";

for (const substring of listOfSubstrings) {
  theString = theString.replace(new RegExp(`[^${substring}]`, "g"), "");
}

然而,如果我们仔细查看(或测试)代码,我们会看到并理解循环后没有留下任何内容:在每次迭代中,列表中除了当前元素之外的所有元素都被移除,准确地说,在第二次迭代之后什么都不留下。
那么,对于给定的字符串和子字符串列表,你有什么想法可以实现我提供的最终结果吗?

qvk1mo1f

qvk1mo1f1#

您可以 match 这些子字符串并 join 所有匹配。

const result = theString.match(/(?:dog|brown|The|jumps)/g).join("");

请参见pattern demo at regex101和下面提供的堆栈片段。

const theString = "The quick brown fox jumps over the lazy dog";
const listOfSubstrings = ["dog", "brown", "The", "jumps"];

// generate regex pattern from listOfSubstrings
const regex = new RegExp('(?:' + listOfSubstrings.join("|") + ')','g');

// extract and join matches
const result = theString.match(regex);

if(result) {
  console.log(result.join(""));
} else {
  console.log('No matches!');
}
slmsl1lt

slmsl1lt2#

此解决方案按空格拆分输入,按感兴趣的单词过滤列表,然后将其连接回一个不含空格的字符串,以获得所需的结果:

const input = 'The quick brown fox jumps over the lazy dog';
const listOfSubstrings = ["dog", "brown", "The", "jumps"];
let regex = new RegExp('^(' + listOfSubstrings.join('|') + ')$');
let result = input.split(' ').filter(str => regex.test(str)).join('');
console.log(result);

输出:

Thebrownjumpsdog
lp0sw83n

lp0sw83n3#

你可以试试这个:

const listOfSubstrings = ["dog", "brown", "The", "jumps"];
let theString = "The quick brown fox jumps over the lazy dog";

let result = "";

const theStringArray = theString.split(" ");

theStringArray.forEach(s => {
    if(listOfSubstrings.includes(s)){
        result += s;
    }
})

但是如果你的listOfSubstrings比较大的话,这个过程可能会比较慢。为此,你可以把你的listOfSubstrings转换成字典

const listOfSubstrings = ["dog", "brown", "The", "jumps"];
let theString = "The quick brown fox jumps over the lazy dog";

let result = "";

const theStringArray = theString.split(" ");

let substrings = {};

// converting array to dictionary
listOfSubstrings.forEach(e=>{
    substrings[e] = e;
})

theStringArray.forEach(s => {
    if(substrings[s] !== undefined){
        result += s;
    }
})

使用字典的原因是检查键是否存在,工作时间为O(1),而数组. includes工作时间为O(n)。

相关问题