Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Фильтр по начальным символам (https://javascript.ru/forum/angular/54346-filtr-po-nachalnym-simvolam.html)

Shasoft 14.03.2015 00:00

Фильтр по начальным символам
 
Нужен фильтр по начальным символам слов. Т.е. есть массив предложений:
  1. Вася умный
  2. Петя туповатый
  3. Коля великий
Вводим 'в' и получаем 1(Вася) и 3(великий).
Добавляем 'ва' и получаем только 1 (Вася)

Стандартный фильтр при вводе 'в' найдет все, так как он просто ищет наличие последовательности.

p.s.В обще-то можно и просто функцию без привязки к angular. А то вроде просто, но все-таки функция замороченная получается.

Shasoft 18.03.2015 21:45

Вроде придумал. Создаю два RegExp и проверяю для них все фразы.
var re0 = new RegExp("[\\s|,|.]"+n, "gi");
var re1 = new RegExp("^"+n, "gi");
n - искомая последовательность символов

MetaDriver 19.03.2015 19:18

Цитата:

Сообщение от Shasoft (Сообщение 361973)
Вроде придумал. Создаю два RegExp и проверяю для них все фразы.
var re0 = new RegExp("[\\s|,|.]"+n, "gi");
var re1 = new RegExp("^"+n, "gi");
n - искомая последовательность символов

Работает? Примерчик сделай прямо тут, пжалста, если не трудно. Полезная штука в принципе, для всяких гридов и т.п.

Shasoft 20.03.2015 15:55

var re0 = new RegExp("[\\s|,|.]"+n, "i");
var re1 = new RegExp("^"+n, "i");
Убрал 'g' из параметров. Вроде работает. Хотел в один RegExp объединить, но знаний не хватает.

MetaDriver 21.03.2015 03:54

Цитата:

Сообщение от Shasoft (Сообщение 362273)
var re0 = new RegExp("[\\s|,|.]"+n, "i");
var re1 = new RegExp("^"+n, "i");
Убрал 'g' из параметров. Вроде работает. Хотел в один RegExp объединить, но знаний не хватает.

Я тоже не силён в регулярках, но попробовал бы так:
var re = new RegExp("^|[\\s|,|.]"+n, "i");
--
upd.
C утречка глянул ещё разок. Поправка:
var re = new RegExp("(^|[\\s|,|.])"+n, "i");
--
upd 2
Мне сейчас регулярки как раз актуальны (делаю формы для редактирования с валидацией), а посему глянул доки.
Всё может оказаться попроще. Цитата из мануала:
Код:

    \b  :  Позиция между символом ASCII и не символом ASCII (граница слова)
итого имеем две простых версии:
1)
var re = new RegExp("\b"+n, "i");
2)
var re = new RegExp("(^|\b)"+n, "i");

Первый вариант будет/не будет работать в зависимости от того, считается ли начало строки границей слова, второй вроде по любому должон работать

Shasoft 21.03.2015 15:38

MetaDriver,
Честно говоря не очень понимаю что значит символ ASCII в данном случае. По идее a-z тоже символ ASCII.

MetaDriver 21.03.2015 18:01

Цитата:

Сообщение от Shasoft (Сообщение 362369)
MetaDriver,
Честно говоря не очень понимаю что значит символ ASCII в данном случае. По идее a-z тоже символ ASCII.

Не бери в голову (пока). Просто проверь. // и отпишись о результатах
У меня PhpStorm говорит что будут работать оба последних варианта (в Web/PhpStorm есть тестер RegExp'ов).

Shasoft 21.03.2015 19:01

Сделал пример на plnkr.

Вариант с \b что-то не работает.

MetaDriver 21.03.2015 23:03

Цитата:

Сообщение от Shasoft (Сообщение 362395)
Сделал пример на plnkr.

Вариант с \b что-то не работает.

Да, действительно, не работает. Даже с исправлением (\\b) (бэкслеш нужно удваивать при создании в конструкторе из строки). Ну и ладно, зато "(^|[\\s|,|.])" + n работает безотказно.
Видимо плагин для PhpStorm (как выяснилось, это сторонний плагин RegexpTester ), местами не совсем корректен.
// А вообще плагин классный, рекомендую, я сегодня на нём быстро отладил десяток регулярок для своей автоформы.

Shasoft 22.03.2015 09:25

MetaDriver,
Я на https://regex101.com/ тестирую RegExp-ы обычно.

p.s.исправил \b на \\b

Нашел проблему: если в искомой строке присутствуют управляющие символы RegExp (к примеру '('), то динамическое создание RegExp происходит с ошибкой. Так что перешел на вариант предложенный тут.


Часовой пояс GMT +3, время: 19:44.