Определение строки по маске node.js
Доброго времени суток!
Возникла необходимость определять соответствует строка маске или нет. Вариантов масок достаточно много и перебирать каждую строку через indexOf не очень удобно, да и думаю не совсем правильно.
Вообщем приведу несколько примеров масок:
эта строка https://example.com/post338159850
должна соответствовать
этой маске https://example.com/post[тут данные]
В предыдущем варианте сложности нет, а вот в следующем не очень уже удобно
https://example.com/post338159850?z=add_user5676465_546776845783%2F4767HJG8hjg76897fgn
https://example.com/post[тут данные]?z=add_user[тут данные]_[тут данные]%2F[тут данные]
чтобы определить эту строку мне надо проверить с помощью indexOf https://example.com/post и ?z=add_user и %2F и если все вернуло 1 то говорить окей это эта строка и начинать юзать сплит до потери пульта пока не получу все параметры и не помещу их в переменные.
Есть ли способ который кучу этого бесполезного кода превратить в проверку на маску через тот же if или лучше всего switch - case и разделит строку на массив ['338159850','5676465','546776845783','4767HJG8hjg76897fgn']
Если есть подобные готовые варианты то будет очень круто а если нет я так понимаю прийдется написать свою функцию
Ответы (1 шт):
Вообщем немного изменил маску и использую regexr... вообщем вот готовые функции которые мне нужны были:
/*
возвращает false или true в зависимости от результата
compares(
'https://example.com/post338159850?z=add_user5676465_546776845783%2F4767HJG8hjg76897fgn',
\https:\/\/example.com\/post[0-9]*\?z=add_user[-?0-9]*_[0-9]*%2F[A-Za-z0-9]*\);
*/
function compares(str, mask) {
try {
if ((str.length == 0 || str.length == undefined) && (mask.length == 0 || mask.length == undefined)) {
return false;
}
let res = str.match(mask);
if (res != null) {
if (res[0] == str) {
return true;
}
else { return false; }
}
else { return false; }
} catch {
return false;
}
}
/*
достаем любые данные с любого текста используя маску [data]
parse(
'https://example.com/post338159850?z=add_user5676465_546776845783%2F4767HJG8hjg76897fgn',
https://example.com/post[data]?z=add_user[data]_[data]%2F[data], [data], (err, res) => {
if (!err) {
let from_id = res[0];
let owner_id = res[1];
let party_id = res[2];
let hash = res[3];
}
});
*/
async function parse(match, mask, char = "[data]", callback) {
try {
if ((match.length == 0 || match.length == undefined) && (mask.length == 0 || mask.length == undefined) && (char.length == 0 || char.length == undefined)) {
return callback(new Error('Incorrect data was transmitted.'));
}
let string = mask.split('[data]');
string.pop();
let result = [];
for (const [index, value] of string.entries()) {
result.push(match.split(value)[1].split(string[index + 1])[0]);
let a = match.replace(value, '').replace(result[index], '');
match = a.replace(result[index], '');
}
return callback(null, result);
} catch {
return callback(new Error('Parsing failed.'))
}
}