Как захватить слово в тексте при переходе на новую строчку
Ребят подскажите, есть функция getWords(str) которая получает слова из текста с разделителем по пробелу String.fromCharCode(32) и заносит в массив wholetextarr
var wholetextarr = [];
getWords(finalval);
function getWords(str) {
str = str + ' ';
for (var i = 0; i<str.length; i++) {
if (str[i] !== String.fromCharCode(32) && ((str[i-1] == String.fromCharCode(32)) || (i == 0))){
for (var j=0; j<str.length; j++) {
var nextspace;
var word;
if (str[j+i] == String.fromCharCode(32)) {
nextspace = j+i;
word = str.slice(i,nextspace);
wholetextarr.push(word);
break;
}
}
}
}
return array1;
}
Проблема заключается в том, что при переходе каретки на другую строку программа два слова (последнее в предыдущей строке и первое в текущей) объединяет вместе. Если поставить условие проверки || str[j+i]=='\n' в эту строку условия if (str[j+i] == String.fromCharCode(32) || str[j+i]=='\n') { программа пропускает это первое слово на текущей строке и не заносит его в массив. Как сделать так, чтобы слово присутствовало в массиве? Подумал. Если это песни в основном, делаю это на тренажере trenajor.me то поставить проверку условия, что слово на новой строке начинается с большой буквы и взять это как условие. Но может существует ещё какой-нибудь способ? Подскажите.
Ответы (2 шт):
Можно использовать регулярное выражение. В примерах ниже для демонстрации работы кода исходный текст песни помещён в текстовое поле для наглядности и сохранения переноса строк.
Уникальные слова (нижний регистр)
function getWords(str) {
return [...new Set(str.trim().split(/[^a-zA-Zа-яА-ЯёЁ]+/).map(item => item.toLowerCase()))];
};
// 1. С помощью `trim` удаляем пробелы по краям, чтобы при разбиении не получить пустых значений массива.
// 2. С помощью `split` разбивает текст на слова, используя в качестве разделителя неалфавитные символы.
// 3. Проходим по полученному массиву и переводим все значения в нижний регист.
// 4. С помощью `Set` оставляем только уникальные значения, затем приводим к типу `array`.
// В переменную `text` ниже сохраняем текст, в данном случае из текстового поля, но источник может быть любой
let text = document.getElementById("text").value;
// Получаем массив с уникальными словами из исходного текста
let words = getWords(text);
console.log(words);
<textarea cols="50" rows="40" id="text">
Когда переехал, не помню,
Наверное был я бухой,
Мой адрес не дом и не улица,
Мой адрес сегодня такой:
Ввв ленинград спб точка ру
Ввв ленинград спб точка ру
Когда тормозит меня мусор,
Прописки, мол, нет никакой,
То я отвечаю спокойно -
Мой адрес сегодня такой:
Ввв ленинград спб точка ру
Ввв ленинград спб точка ру
</textarea>
Все слова
function getWords(str) {
return str.trim().split(/[^a-zA-Zа-яА-ЯёЁ]+/);
};
// 1. С помощью `trim` удаляем пробелы по краям, чтобы при разбиении не получить пустых значений массива.
// 2. С помощью `split` разбивает текст на слова, используя в качестве разделителя неалфавитные символы.
// В переменную `text` ниже сохраняем текст, в данном случае из текстового поля, но источник может быть любой
let text = document.getElementById("text").value;
// Получаем массив со всеми словами из исходного текста
let words = getWords(text);
console.log(words);
<textarea cols="50" rows="40" id="text">
Когда переехал, не помню,
Наверное был я бухой,
Мой адрес не дом и не улица,
Мой адрес сегодня такой:
Ввв ленинград спб точка ру
Ввв ленинград спб точка ру
Когда тормозит меня мусор,
Прописки, мол, нет никакой,
То я отвечаю спокойно -
Мой адрес сегодня такой:
Ввв ленинград спб точка ру
Ввв ленинград спб точка ру
</textarea>
Renich! Ваш ответ мне понравился. раньше никогда не пользовался регулярными выражениями, при том что я пока 2 с половиной месяца всего изучаю js. Но тут есть минусы. Надо добавлять будет другие алфавиты, потому что в других алфавитах есть буквы, которых нет ни в английском ни в русском.Мой тренажер trenajor.me Тренирует на любом языке кроме восточных (хотя их символы тоже можно впихнуть) Второй вариант, надо оставлять знаки препинания, потому что моя программа проверяет посимвольно и каждое слово - это сумма символов,когда слово перемешано, можно давать подсказки, чтобы обучаемому было легче угадывать. А перемешанное слово,это все равно одна и та же сумма символов и так я могу находить искомое слово по сумме в массиве.
Но наверное, с помощью рег выражений можно оставить и знаки препинания. Я это сделал так.
в функцию getWords(str) добавил в начало следующее.
str = str.split('\n'); // разбиваю текст на массив по разделителю переход на новую строчку
for (var i=0; i<str.length; i++) { // добавляю пробел к каждому элементу массива то есть к концу строки, потому что проверка в последующем коде getWords идет на поиск пробела для захвата слова
str[i] = str[i] + ' ';
}
`str = str.join('');` // соединяю массив в одно целое без запятых, а дальше код ниже создает массив со словами