javascript: выделение подстроки из строки, так чтобы подстрока содержала N слов — javascript строки поиск

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд
Загрузка...

Вопрос:


Приветствую,

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

есть некоторая строка, например «жили были дед да баба, ели кашу с молоком»

1) нужно выделить из нее начиная с заданной позиции подстроку, которая содержала бы 3 слова,

например, с позиции pos = 7 должно получиться

«ыли дед да»

с позиции pos = 11 должно получиться

«дед да баба»

2) желательно, чтобы если позиция приходится на середину слова, то слово попадало бы целиком,

например с позиции pos = 7 должно получиться

«были дед да»

3) если до конца строки от позиции остаётся меньше слов, то выводится меньше слов

4) знаки препинания словами не считаются, но в подстроку входят

Это все можно реализовать по тупому, анализируя побуквенно строку в обе стороны, но хотелось бы сделать более правильно, более компактно

Автор вопроса: Zhihar

const text = "жили были дед да баба, ели кашу с молоком";

pos.onchange = e => console.log(
  pos.value,
  text.match(
    new RegExp(`.{${pos.value-1}}([^\s]+\s+[^\s]+\s+[^\s]+(\s+|$))`)
  )[1]
)
<input id="pos" type="numer" value="7" />
const text = "жили были дед да баба, ели кашу с молоком";

pos.onchange = e => console.log(
  pos.value,
  text.substr(pos.value - 1, text.length)  
    .split(/s+/)
    .slice(0,3)
    .join(' ')
)
<input id="pos" type="numer" value="7" />

Реализовал способ, предложенный @Akina:

    var part1 = text.substring(0, pos);
    var part2 = text.substring(pos);

    var array1 = part1.split(" ");
    var array2 = part2.split(" ");

    var subarray1 = array1.slice(array1.length - 1, array1.length);
    var subarray2 = array2.slice(0, 3);

    var newText = subarray1.join(" ") + subarray2.join(" ");

Работает все замечательно, но все таки это 7 строчек + может потребоваться добавить код, что если позиция указывает не на цифру или букву (например, пробел или знаки препинания), то надо брать все 3 слова спереди и ни одного сзади, но это мелочи.

Источник

Вам также может быть интересно:

Drag and Drop UWP — c# xaml mvvm
Вопрос: Нужно иметь возможность добавлять изображения в приложение путем перетаскивания из файловой системы У Grid включил AllowDrop. Но как добавить перетаскиваемые изображения в коллекцию? Т.к. те ...
Растягивание Высоты , Резина — html css html5
Вопрос: Здравствуйте! Реализовал резиновый дизайн. Растягивается ширина, но длина по % не растягивается. Возможно ли это реализовать? Или так и задумано, растягивание только на ширину ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
requestAnimation и очередность отрисовки — javascript canvas
Вопрос: Здравствуйте! Реализовал 2D игру и в Edge работает все плавно и круто, но в Firefox'e подвисает, сказали, что нужно сделать, чтобы раз-два момент и все ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
ViewPager внутри ViewPager — такие матрешки работают? — android viewpager
Вопрос: Доброго времени суток. Назрела новая задача. Есть каталог мастеров. При выборе конкретного мастера открывается его страница (активити с ViewPager), и теперь мастеров можно перелистывать свайпом. ...
Почему id всегда 1 Yii2 — yii авторизация
Вопрос: Использую все как по документации. Для получения информации о пользователе использую $identity = $model->findOne(]); И каким бы не был email, id пользователя всегда ...

Оставьте ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *