Фильтр по начальным буквам слова
Есть массив фраз (может быть более одного слова в фразе). На входе есть последовательность символов - требуется найти все фразы, которые содержат слова, начинающиеся с этих символов.
Может есть у кого такая функция или ссылка на исходники? |
Shasoft,
var phrase = ['Есть массив фраз','может быть более одного слова в фразе','На входе есть последовательность символов'], word = ['ма','си'];
function oneINother(word,phrase) {
function c(d) {
return word.some(function(a) {
return (new RegExp("^" + a)).test(d)
})
}
return phrase.filter(function(a) {
return a.split(/\s+/).some(c)
})
};
alert(oneINother(word,phrase));
|
У меня вот так получилось. Создаю два RegExp и проверяю для них все фразы.
var re0 = new RegExp("[\\s|,|.]"+n, "gi");
var re1 = new RegExp("^"+n, "gi");
n - искомая последовательность символов |
var re0 = new RegExp("[\\s|,|.]"+n, "i");
var re1 = new RegExp("^"+n, "i");
Убрал 'g' в параметрах. Оно не нужно |
зачем тут вообще регулярки?
substring = lower(substring);
line = lower(line);
words = line.split(/\s+/);
for each word
chunk = word.slice(0, substring.length);
chunk === substring // {Boolean}
|
Цитата:
|
Цитата:
речь шла про сравнение |
По моему с регулярками более понятно
var re0 = new RegExp("[\\s|,|.]"+substring, "i");
var re1 = new RegExp("^"+substring, "i");
if( re0.test(line) || re1.test(line) )
{
}
Но, как известно, на вкус и цвет... :)Можно было по скорости сравнить, но тут только практический тест поможет |
Цитата:
alert(new RegExp('1+2').test('1+2'));
alert(new RegExp('Вася?!').test('Вася?!'));
alert(new RegExp('Вася(Крюков)').test('Вася(Крюков)'));
|
nerv_, сделал пример на plnkr.
Добавил и ваш вариант. Он не находит вариант "Грач,ВорОна,Сорока" если ввести маску "в". Вариант с двумя RegExp переделали на один RegExp
var re = new RegExp("(^|[\\s|,|.])" + n, "i");
|
Цитата:
А вот это как решить? :) кроме того
this.test = function(text) {
return text
.toLowerCase()
.split(/[\s,]+/)
.some(function(word) {
return word.slice(0, n.length) === n;
});
};
(не проверял) |
nerv_,
уговорили. Ваш вариант лучше, так как в моей если в строке есть управляющие символы типа '(', то фигня получается. Т.е. нужно экранировать их. Так что перешел на ваш вариант. |
:write:
так и не понял что быстрее :)
var phrase = ['Есть массив фраз','Грач,ВорОна,Сорока','Вася(Крюков)'], word = ['в'];
function oneINother(word,phrase) {
function c(d) {
return word.some(function(a) {
// return (new RegExp("^" + a, "i")).test(d)
return d.toLowerCase().slice(0, a.length) === a.toLowerCase();
})
}
return phrase.filter(function(a) {
return a.split(/[\s,.]+/).some(c)
})
};
console.time('test');
oneINother(word,phrase);
console.timeEnd('test');
alert(oneINother(word,phrase));
function oneINother2(word,phrase) {
function c(d) {
return word.some(function(a) {
return (new RegExp("^" + a, "i")).test(d)
// return d.toLowerCase().slice(0, a.length) === a.toLowerCase();
})
}
return phrase.filter(function(a) {
return a.split(/[\s,.]+/).some(c)
})
};
console.time('test2');
oneINother2(word,phrase);
console.timeEnd('test2');
alert(oneINother2(word,phrase));
|
На 3-х фразах смысла нет тестировать. Нужно побольше вариантов.
А пример вообще показывает противоположные значения при нескольких запусках. :) |
| Часовой пояс GMT +3, время: 01:22. |