Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите с регуляркой (https://javascript.ru/forum/misc/79127-pomogite-s-regulyarkojj.html)

Tipylja 22.12.2019 11:54

Помогите с регуляркой
 
Здравствуйте. Помогите с регулярукой для поиска. Допустим есть массив со строками:
  • Петров Василий Сергеевич
  • Иванов Василий Петрович
  • Краснов Сергей Петрович
Нужно что бы регулярка совпадала в случае, если есть совпадение в последовательности введенных букв в поиске. То есть если я введу ‘вас’ то получу:
  • Петров Василий Сергеевич
  • Иванов Василий Петрович
Если я введу ‘ив’ то получу:
  • Иванов Василий Петрович
Если ‘пет’, то получу все три результата.
То есть не важно какие символы идут до ключа и после ключа, главное, что в строке есть последовательность введенных букв:)

рони 22.12.2019 13:09

Цитата:

Сообщение от Tipylja
Помогите с регулярукой для поиска.

indexOf
Поиск подстроки

toLowerCase
Изменение регистра

Tipylja 22.12.2019 13:27

Я не стал вдаваться в детали, на деле это поиск через плагин для mongoose в mongoDB, туда нужно передать регулярку, так что нужна именно регулярка

рони 22.12.2019 13:33

Tipylja,
строки 26, 34, 35.
https://javascript.ru/forum/517444-post11.html

Tipylja 22.12.2019 15:22

Благодарю за ответ, вроде это не совсем то, что нужно, возможно я чуть не так описал задачу - нужно забыть про массив=)) Мне просто нужно что бы регулярка проверяла есть ли в одной строке последовательность букв введенных в поиск. Я очень плох в регулярках, по этому и попросил помощи, если говорить абстрактно, на примере маски, то это должно выглядеть как-то так - **str** - то есть - не важно есть ли символы вначале, какие они и тд, не важно есть ли символы после строки, какие они и т.д. - главное что бы была последовательность букв str. Как-то так
RegExp(`/\D/${options.search.toString()\D}`

laimas 22.12.2019 15:36

Цитата:

Сообщение от Tipylja
вроде это не совсем то, что нужно
нужно что бы регулярка проверяла есть ли в одной строке последовательность букв введенных в поиск

Это
Цитата:

Сообщение от рони
indexOf
Поиск подстроки

как раз и нужно в таком случае.

рони 22.12.2019 15:38

Цитата:

Сообщение от Tipylja
Как-то так
RegExp(`/\D/${options.search.toString()\D}`

Цитата:

Сообщение от рони
строки 26, 34, 35.

:-?

рони 22.12.2019 15:42

Tipylja,
RegExp.escape = s => s.replace(/[[\\^$.|?*+()]/gim, "\\$&");
function createReg(str)
{
   return new RegExp(RegExp.escape(str), "gi");
}
alert(createReg("test"));

рони 22.12.2019 15:53

Tipylja,
const arr = [
"Петров Василий Сергеевич",
"Иванов Василий Петрович",
"Краснов Сергей Петрович"];
RegExp.escape = s => s.replace(/[[\\^$.|?*+()]/gim, "\\$&");
const createReg = search => new RegExp(RegExp.escape(search), "i");
let search = "вас";
let reg = createReg(search);
let arSearch = arr.filter(str => reg.test(str));
console.log(search, arSearch)

рони 22.12.2019 15:58

Tipylja,
const arr = [
"Петров Василий Сергеевич",
"Иванов Василий Петрович",
"Краснов Сергей Петрович"];

let search = "вас";
let arSearch = arr.filter(str => ~str.toLowerCase().indexOf(search.toLowerCase()));
console.log(search, arSearch)

Aetae 22.12.2019 16:26

рони, сам всегда юзал такой способ, но прочитал вот и как-то погрустнел.

рони 22.12.2019 16:51

Aetae,
спасибо за ценную информацию! :thanks:

Tipylja 22.12.2019 20:12

Дело в том, что у меня нет тех строк в которых будет происходить поиск - они в БД. Я могу указать или точную строк для поиска, в запросе к БД или регулярное выражение. Если я укажу "Василий", то я получу в ответ обе записи из БД с точным совпадением:
  • "Петров Василий Сергеевич"
  • "Иванов Василий Петрович"
Вот как это выглядит в коде
module.exports.personGetAllWithParams = options => Persons.paginate(
      {
        $text: { $search: 'Василий' }
      },
      options
    );

То есть в $search я передал свою строку для поиска внутри бд, при запросе. Так же туда можно передать регулярку - это мне и нужно поидее, что бы я мог искать не по целому слову, а по нескольким символам
module.exports.personGetAllWithParams = options => {
return Persons.paginate(
      {
        $text: { $search: RegExp(`/.[${options.search.toString()}]./`, "i") }
      },
      options
    );
}

вот в $search я передаю RegExp - в него я могу передать ту строку которую ввел пользователь для поиска внутри БД. То есть я не могу тут применить indexOf и другие варианты.

рони 22.12.2019 21:04

Цитата:

Сообщение от Tipylja
что бы я мог искать не по целому слову, а по нескольким символам

если нужен RegExp вам дали код, в чём проблема?

laimas 22.12.2019 21:06

Tipylja, речь оказывается о MongoDB, тогда читать, например тут.


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