javascript - 在字符串中的 Y 索引处查找 X 字符并使用此信息过滤数组

标签 javascript string

我得到了一个字符串和一个字符串数组。字符串的例子是:

let example1 = "_a_t_";
let example2 = "N_l_:t___";
let example3 = "B__z_l";

我们可以看到字符串的长度为 Z 个字符,并且得到了随机数量的非 _ 字符。字符串永远不会只有 _,也永远不会没有下划线。

let array = ["Walts", "Grate", "Ralts", "Names"];

如果我们使用上面的 example1 字符串和数组,我想过滤数组,这样结果就变成了:

let newArray = ["Walts", "Ralts"];

基本上,我想使用它们的已知字符和它们的位置来过滤数组。目前我已经找到了如何找到第一个字符并用它来过滤数组。这是这样做的:

let example1 = "_a_t_";
let array = ["Walts", "Grate", "Ralts", "Names"];

let charIndex = example1.match("[a-zA-Z]").index;
/*Currently using the RegEx [a-zA-Z], but this should be changed to include all characters 
besides underscores but I don't know what to put in between the square brackets*/
let firstChar = example1.charAt(charIndex);

let filteredArray = array.filter(function (element) {
  return element.charAt(charIndex) === firstChar;
});

console.log(filteredArray); //this returns ["Walts", "Ralts", "Names"]

我就卡在这里了。如果我在字符串中有多个显示字符,我不知道该怎么做。经过一番思考,对我来说合乎逻辑的事情是以某种方式计算所有不是下划线的字符,然后使用它来进行循环。循环会找到每个字符及其索引,然后过滤数组。当数组被完全过滤时,循环将结束。使用上面的数组和 example1 字符串,希望的目标是获得 ["Walts", "Ralts"]

我认为问题解释的很透彻,最终目标也很明确。这是我在 Stack Overflow 上的第一篇文章,所以我非常兴奋。

最佳答案

另一种选择是创建一个正则表达式,并将所有单词加入一个非捕获组中,使用 | 作为分隔符,并对 _ 进行一次替换> 到 \S 以匹配非空白字符以不匹配空格

模式看起来像:

^(?:\Sa\St\S|N\Sl\S:t\S\S\S|B\S\Sz\Sl)$

模式匹配:

  • ^ 字符串开始
  • (?: 非捕获组
    • \Sa\St\S 第一个选择,其中 \S 匹配一个非空白字符
    • | 或者
    • N\Sl\S:t\S\S\S 第二个选择
    • | 或者
    • B\S\Sz\Sl 第三种选择
  • ) 关闭非捕获组
  • $ 字符串结束

例如

let example1 = "_a_t_";
let example2 = "N_l_:t___";
let example3 = "B__z_l";
let array = ["Walts", "Grate", "Ralts", "Names"];
const strings = [example1, example2, example3];
const regex = new RegExp(`^(?:${strings.join("|").replace(/_/g, "\\S")})$`);
console.log(array.filter(s => regex.test(s)));

如果要匹配空格,可以使用.代替\S

注意 RegExp()构造函数,你必须双重转义反斜杠。如果任何字符串包含正则表达式的特殊字符,则必须 escape那些字符。

另一个例子:

const escapeRegExp = s => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
let example1 = "_a_t_";
let example2 = "N_l_:t___";
let example3 = "B__z_l";
let example4 = "T__()"
let array = ["Walts", "Grate", "Ralts", "Names", "Tab()"];
const strings = [example1, example2, example3, example4].map(s => escapeRegExp(s));
const regex = new RegExp(`^(?:${strings.join("|").replace(/_/g, ".")})$`);
console.log(array.filter(s => regex.test(s)));

关于javascript - 在字符串中的 Y 索引处查找 X 字符并使用此信息过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66912215/

相关文章:

python - 比较字符串时 < 或 > 在 python 中意味着什么

c# - 如何将 ListItemCollection (dropdownlist.items) 转换为字典<string,string>?

javascript - 如何检查字符串是否以javascript中的数字开头

java - 如何在java中分割复杂字符串以及如何对值求和?

java - 如何计算以字符串形式给出的数学表达式?

javascript - 使用javascript附加问题更改每个单词的第一个字母的字体大小

javascript - 默认光标在 IE 和 Mozilla 中不起作用

javascript - 跨源请求被阻止 : Occur even after CORS enabled on my API ;

Javascript Web 音频 API - AudioContext 到 base64

javascript - 可以让浏览器在满足特定条件时播放声音文件吗?