我得到了一个字符串和一个字符串数组。字符串的例子是:
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/