Что-то в этом духе должно помочь вам начать (см. Комментарии):
function removeUnwantedChars(str) {
return str.replace(/\W/g, "");
}
function search(str) {
// Create regex like "abc" becomes "^a.*b.*c"
str = removeUnwantedChars(str);
if (!str) {
return [];
}
const searchRex = new RegExp(
"^" +
RegExp.escape(str.charAt(0)) + [...str.substring(1)].map(ch =>
".*" + RegExp.escape(ch)
).join(""),
"i"
);
// Search for matches
return songs.filter(song => searchRex.test(song.Song_Name.replace(/\W/g, "")));
}
... с использованием функции экранирования регулярных выражений в соответствии с теми, что в ответы на этот вопрос .
Live Пример:
if (!RegExp.escape) {
RegExp.escape = function(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
};
}
const songs = [
{Song_Name: "U2 - I Still Haven't Found What I'm Looking For"},
{Song_Name: "Oasis - Champagne Supernova"},
{Song_Name: "Oasis - Don't Look Back In Anger"},
{Song_Name: "The Rolling Stones - Like A Rolling Stone"}
];
function removeUnwantedChars(str) {
return str.replace(/\W/g, "");
}
function search(str) {
// Create regex like "abc" becomes "^a.*b.*c"
str = removeUnwantedChars(str);
if (!str) {
return [];
}
const searchRex = new RegExp(
"^" +
RegExp.escape(str.charAt(0)) + [...str.substring(1)].map(ch =>
".*" + RegExp.escape(ch)
).join(""),
"i"
);
// Search for matches
return songs.filter(song => searchRex.test(song.Song_Name.replace(/\W/g, "")));
}
const testStrings = [
"oasisdontlookbackin",
"oasisanger",
"therollstone",
"rolling" // no match
];
for (const str of testStrings) {
console.log(str, "=>", search(str));
}
.as-console-wrapper {
max-height: 100% !important;
}
.*
в регулярном выражении означает «любое число любого символа здесь», что означает, что вам не нужно вводить каждые значимый символ после первого (поэтому "oasisanger"
работает).Но это включает в себя ваше требование, чтобы первый символ совпадал с первым символом имени.