Подсчет слов в строке

92

Я пытался считать слова в тексте таким образом:

function WordCount(str) {
  var totalSoFar = 0;
  for (var i = 0; i < WordCount.length; i++)
    if (str(i) === " ") { // if a space is found in str
      totalSoFar = +1; // add 1 to total so far
  }
  totalsoFar += 1; // add 1 to totalsoFar to account for extra space since 1 space = 2 words
}

console.log(WordCount("Random String"));

Я думаю, что у меня это довольно хорошо, но я считаю, что ifутверждение неверно. Часть, которая проверяет, str(i)содержит ли пробел, и добавляет 1.

Редактировать:

Я узнал (благодаря Blender), что могу сделать это с намного меньшим количеством кода:

function WordCount(str) { 
  return str.split(" ").length;
}

console.log(WordCount("hello world"));
Валерио Бозз
источник
Не было str.split(' ').lengthбы более простого метода? jsfiddle.net/j08691/zUuzd
j08691 08
Или, str.split(' ')а затем посчитать те, которые не являются строками нулевой длины?
Кэти Килиан
8
string.split ('') .length не работает. Пробелы - не всегда границы слов! Что делать, если между двумя словами больше одного пробела? Что о ". . ." ?
Aloso
Как сказал Алосо, этот метод не сработает.
Reality-Torrent,
1
@ Reality-Torrent Это старый пост.
cst1992

Ответы:

108

Используйте квадратные скобки, а не скобки:

str[i] === " "

Или charAt:

str.charAt(i) === " "

Вы также можете сделать это с помощью .split():

return str.split(' ').length;
Блендер
источник
Я думаю, я понял, о чем вы говорите, выглядит ли мой код выше в отредактированном исходном вопросе нормально?
будет ли ваше решение работать, если слова разделены чем-либо, кроме символа пробела? С помощью новой строки или табуляции?
nemesisfixx
7
@Blender хорошее решение, но это может дать неверный результат, если в строке пропущены двойные пробелы ..
ipalibowhyte
95

Попробуйте это, прежде чем изобретать колеса

from Подсчитать количество слов в строке с помощью JavaScript

function countWords(str) {
  return str.trim().split(/\s+/).length;
}

из http://www.mediacollege.com/internet/javascript/text/count-words.html

function countWords(s){
    s = s.replace(/(^\s*)|(\s*$)/gi,"");//exclude  start and end white-space
    s = s.replace(/[ ]{2,}/gi," ");//2 or more space to 1
    s = s.replace(/\n /,"\n"); // exclude newline with a start spacing
    return s.split(' ').filter(function(str){return str!="";}).length;
    //return s.split(' ').filter(String).length; - this can also be used
}

from Использовать JavaScript для подсчета слов в строке, БЕЗ использования регулярного выражения - это будет лучший подход

function WordCount(str) {
     return str.split(' ')
            .filter(function(n) { return n != '' })
            .length;
}

Примечания от автора:

Вы можете адаптировать этот скрипт для подсчета слов по своему усмотрению. Важная часть s.split(' ').length- это подсчет пробелов. Перед подсчетом скрипт пытается удалить все лишние пробелы (двойные пробелы и т. Д.). Если текст содержит два слова без пробела между ними, он будет считать их одним словом, например, «Первое предложение. Начало следующего предложения».

внутренности в
источник
Я просто никогда не видел такого синтаксиса: s = s.replace (/ (^ \ s *) | (\ s * $) / gi, ""); s = s.replace (/ [] {2,} / gi, ""); s = s.replace (/ \ n /, "\ n"); что означает каждая строка? извините за то, что так
что-нибудь? этот код очень сбивает с толку, и тот веб-сайт, который вы буквально скопировали и вставили с него, совершенно бесполезен. Я просто запутался больше всего, что я понял, что он должен проверять слова без пробелов, наши двойные пробелы, но как? просто миллион случайно размещенных символов действительно не помогает ...
Приятно, что все, о чем я просил, - это объяснить свой код, который вы написали. Я никогда раньше не видел синтаксиса и хотел знать, что он означает. Ничего страшного, я задал отдельный вопрос, и кто-то подробно ответил на мой вопрос. Извини, что прошу так много.
1
str.split (/ \ s + /). length на самом деле не работает как есть: конечный пробел обрабатывается как другое слово.
Ян
2
Обратите внимание, что он возвращает 1 для пустого ввода.
pie6k 01
21

Еще один способ подсчета слов в строке. Этот код подсчитывает слова, содержащие только буквенно-цифровые символы и символы "_", "'", "-", "'".

function countWords(str) {
  var matches = str.match(/[\w\d\’\'-]+/gi);
  return matches ? matches.length : 0;
}
Alex
источник
2
Можно также подумать о добавлении, ’'-чтобы «Кошачье мяуканье» не считалось за 3 слова. И «промежуточный»
mpen 02
@mpen спасибо за предложение. Я обновил свой ответ в соответствии с ним.
Alex
Первый символ в моей строке - это FYI с правой кавычкой, а не
обратная кавычка
1
Вам не нужно выходить ’'из регулярного выражения. Используйте, /[\w\d’'-]+/giчтобы избежать предупреждений ESLint о бесполезном побеге
Стефан Бламберг
18

После очистки строки вы можете сопоставить непробельные символы или границы слов.

Вот два простых регулярных выражения для захвата слов в строке:

  • Последовательность символов, отличных от пробелов: /\S+/g
  • Допустимые символы между границами слов: /\b[a-z\d]+\b/g

В приведенном ниже примере показано, как получить количество слов из строки с помощью этих шаблонов захвата.

/*Redirect console output to HTML.*/document.body.innerHTML='';console.log=function(s){document.body.innerHTML+=s+'\n';};
/*String format.*/String.format||(String.format=function(f){return function(a){return f.replace(/{(\d+)}/g,function(m,n){return"undefined"!=typeof a[n]?a[n]:m})}([].slice.call(arguments,1))});

// ^ IGNORE CODE ABOVE ^
//   =================

// Clean and match sub-strings in a string.
function extractSubstr(str, regexp) {
    return str.replace(/[^\w\s]|_/g, '')
        .replace(/\s+/g, ' ')
        .toLowerCase().match(regexp) || [];
}

// Find words by searching for sequences of non-whitespace characters.
function getWordsByNonWhiteSpace(str) {
    return extractSubstr(str, /\S+/g);
}

// Find words by searching for valid characters between word-boundaries.
function getWordsByWordBoundaries(str) {
    return extractSubstr(str, /\b[a-z\d]+\b/g);
}

// Example of usage.
var edisonQuote = "I have not failed. I've just found 10,000 ways that won't work.";
var words1 = getWordsByNonWhiteSpace(edisonQuote);
var words2 = getWordsByWordBoundaries(edisonQuote);

console.log(String.format('"{0}" - Thomas Edison\n\nWord count via:\n', edisonQuote));
console.log(String.format(' - non-white-space: ({0}) [{1}]', words1.length, words1.join(', ')));
console.log(String.format(' - word-boundaries: ({0}) [{1}]', words2.length, words2.join(', ')));
body { font-family: monospace; white-space: pre; font-size: 11px; }


Поиск уникальных слов

Вы также можете создать сопоставление слов, чтобы получить уникальные подсчеты.

function cleanString(str) {
    return str.replace(/[^\w\s]|_/g, '')
        .replace(/\s+/g, ' ')
        .toLowerCase();
}

function extractSubstr(str, regexp) {
    return cleanString(str).match(regexp) || [];
}

function getWordsByNonWhiteSpace(str) {
    return extractSubstr(str, /\S+/g);
}

function getWordsByWordBoundaries(str) {
    return extractSubstr(str, /\b[a-z\d]+\b/g);
}

function wordMap(str) {
    return getWordsByWordBoundaries(str).reduce(function(map, word) {
        map[word] = (map[word] || 0) + 1;
        return map;
    }, {});
}

function mapToTuples(map) {
    return Object.keys(map).map(function(key) {
        return [ key, map[key] ];
    });
}

function mapToSortedTuples(map, sortFn, sortOrder) {
    return mapToTuples(map).sort(function(a, b) {
        return sortFn.call(undefined, a, b, sortOrder);
    });
}

function countWords(str) {
    return getWordsByWordBoundaries(str).length;
}

function wordFrequency(str) {
    return mapToSortedTuples(wordMap(str), function(a, b, order) {
        if (b[1] > a[1]) {
            return order[1] * -1;
        } else if (a[1] > b[1]) {
            return order[1] * 1;
        } else {
            return order[0] * (a[0] < b[0] ? -1 : (a[0] > b[0] ? 1 : 0));
        }
    }, [1, -1]);
}

function printTuples(tuples) {
    return tuples.map(function(tuple) {
        return padStr(tuple[0], ' ', 12, 1) + ' -> ' + tuple[1];
    }).join('\n');
}

function padStr(str, ch, width, dir) { 
    return (width <= str.length ? str : padStr(dir < 0 ? ch + str : str + ch, ch, width, dir)).substr(0, width);
}

function toTable(data, headers) {
    return $('<table>').append($('<thead>').append($('<tr>').append(headers.map(function(header) {
        return $('<th>').html(header);
    })))).append($('<tbody>').append(data.map(function(row) {
        return $('<tr>').append(row.map(function(cell) {
            return $('<td>').html(cell);
        }));
    })));
}

function addRowsBefore(table, data) {
    table.find('tbody').prepend(data.map(function(row) {
        return $('<tr>').append(row.map(function(cell) {
            return $('<td>').html(cell);
        }));
    }));
    return table;
}

$(function() {
    $('#countWordsBtn').on('click', function(e) {
        var str = $('#wordsTxtAra').val();
        var wordFreq = wordFrequency(str);
        var wordCount = countWords(str);
        var uniqueWords = wordFreq.length;
        var summaryData = [
            [ 'TOTAL', wordCount ],
            [ 'UNIQUE', uniqueWords ]
        ];
        var table = toTable(wordFreq, ['Word', 'Frequency']);
        addRowsBefore(table, summaryData);
        $('#wordFreq').html(table);
    });
});
table {
    border-collapse: collapse;
    table-layout: fixed;
    width: 200px;
    font-family: monospace;
}
thead {
    border-bottom: #000 3px double;;
}
table, td, th {
    border: #000 1px solid;
}
td, th {
    padding: 2px;
    width: 100px;
    overflow: hidden;
}

textarea, input[type="button"], table {
    margin: 4px;
    padding: 2px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<h1>Word Frequency</h1>
<textarea id="wordsTxtAra" cols="60" rows="8">Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal.

Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this.

But, in a larger sense, we can not dedicate -- we can not consecrate -- we can not hallow -- this ground. The brave men, living and dead, who struggled here, have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us -- that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion -- that we here highly resolve that these dead shall not have died in vain -- that this nation, under God, shall have a new birth of freedom -- and that government of the people, by the people, for the people, shall not perish from the earth.</textarea><br />
<input type="button" id="countWordsBtn" value="Count Words" />
<div id="wordFreq"></div>

Мистер Поливирл
источник
1
Это потрясающий и исчерпывающий ответ. Спасибо за все примеры, они действительно полезны!
Коннор
14

Я думаю, что этот метод больше, чем вы хотите

var getWordCount = function(v){
    var matches = v.match(/\S+/g) ;
    return matches?matches.length:0;
}
Шон
источник
7

String.prototype.match возвращает массив, затем мы можем проверить длину,

Я считаю этот метод наиболее наглядным

var str = 'one two three four five';

str.match(/\w+/g).length;
iamwhitebox
источник
1
потенциальное место, где может произойти ошибка, если строка пуста
Пурхало Алекс
5

Самый простой способ, который я нашел до сих пор, - использовать регулярное выражение с разделением.

var calculate = function() {
  var string = document.getElementById('input').value;
  var length = string.split(/[^\s]+/).length - 1;
  document.getElementById('count').innerHTML = length;
};
<textarea id="input">My super text that does 7 words.</textarea>
<button onclick="calculate()">Calculate</button>
<span id="count">7</span> words

Тим
источник
3

Ответ @ 7-isnotbad очень близок, но не учитывает односложные строки. Вот исправление, которое, кажется, учитывает все возможные комбинации слов, пробелов и новых строк.

function countWords(s){
    s = s.replace(/\n/g,' '); // newlines to space
    s = s.replace(/(^\s*)|(\s*$)/gi,''); // remove spaces from start + end
    s = s.replace(/[ ]{2,}/gi,' '); // 2 or more spaces to 1
    return s.split(' ').length; 
}
неокио
источник
3

Вот мой подход, который просто разбивает строку на пробелы, затем for зацикливает массив и увеличивает счетчик, если массив [i] соответствует заданному шаблону регулярного выражения.

    function wordCount(str) {
        var stringArray = str.split(' ');
        var count = 0;
        for (var i = 0; i < stringArray.length; i++) {
            var word = stringArray[i];
            if (/[A-Za-z]/.test(word)) {
                count++
            }
        }
        return count
    }

Вызывается так:

var str = "testing strings here's a string --..  ? // ... random characters ,,, end of string";
wordCount(str)

(добавлены дополнительные символы и пробелы, чтобы показать точность функции)

Строка выше возвращает 10, что правильно!

пользователь3743140
источник
Некоторые языки не использовать [A-Za-z]вообще
David
3

Это обработает все случаи и будет максимально эффективным. (Вы не хотите split (''), если заранее не знаете, что нет пробелов большей длины, чем один.):

var quote = `Of all the talents bestowed upon men, 
              none is so precious as the gift of oratory. 
              He who enjoys it wields a power more durable than that of a great king. 
              He is an independent force in the world. 
              Abandoned by his party, betrayed by his friends, stripped of his offices, 
              whoever can command this power is still formidable.`;

function WordCount(text) {
    text = text.trim();
    return text.length > 0 ? text.split(/\s+/).length : 0;
}
console.log(WordCount(quote));//59
console.log(WordCount('f'));//1
console.log(WordCount('  f '));//1
console.log(WordCount('   '));//0
Уэсли
источник
2

Возможно, есть более эффективный способ сделать это, но он сработал для меня.

function countWords(passedString){
  passedString = passedString.replace(/(^\s*)|(\s*$)/gi, '');
  passedString = passedString.replace(/\s\s+/g, ' '); 
  passedString = passedString.replace(/,/g, ' ');  
  passedString = passedString.replace(/;/g, ' ');
  passedString = passedString.replace(/\//g, ' ');  
  passedString = passedString.replace(/\\/g, ' ');  
  passedString = passedString.replace(/{/g, ' ');
  passedString = passedString.replace(/}/g, ' ');
  passedString = passedString.replace(/\n/g, ' ');  
  passedString = passedString.replace(/\./g, ' '); 
  passedString = passedString.replace(/[\{\}]/g, ' ');
  passedString = passedString.replace(/[\(\)]/g, ' ');
  passedString = passedString.replace(/[[\]]/g, ' ');
  passedString = passedString.replace(/[ ]{2,}/gi, ' ');
  var countWordsBySpaces = passedString.split(' ').length; 
  return countWordsBySpaces;

}

он способен распознавать все следующие слова как отдельные слова:

abc,abc= 2 слова,
abc/abc/abc= 3 слова (работает с прямой и обратной косой чертой),
abc.abc= 2 слова,
abc[abc]abc= 3 слова,
abc;abc= 2 слова,

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

  • игнорирует все начальные и конечные пробелы

  • считает одну букву, за которой следует новая строка, как слово - я обнаружил, что некоторые из предложений, приведенных на этой странице, не считаются, например:
    a
    a
    a
    a
    a
    иногда считается как 0 x слов, а другие функции считают его только как 1 слово вместо 5 слов)

если у кого-то есть идеи, как его улучшить или чище / эффективнее - тогда добавьте 2 цента! Надеюсь, это кому-то поможет.

токарь
источник
2
function countWords(str) {
    var regEx = /([^\u0000-\u007F]|\w)+/g;  
    return str.match(regEx).length;
}

Пояснение:

/([^\u0000-\u007F]|\w)соответствует символам слов - и это здорово -> регулярное выражение делает за нас тяжелую работу. (Этот шаблон основан на следующем SO-ответе: https://stackoverflow.com/a/35743562/1806956 от @Landeeyo)

+ соответствует всей строке ранее указанных символов слова - поэтому мы в основном группируем символы слова.

/g означает, что он ищет до конца.

str.match(regEx) возвращает массив найденных слов - поэтому считаем его длину.

Ронен Рабинович
источник
1
Сложное регулярное выражение - это искусство колдовства. Заклинание, которое мы учимся произносить, но никогда не решаемся спросить, почему. Спасибо, что поделились.
Blaise
^ это потрясающая цитата
r3wt
Я получаю эту ошибку: error Неожиданный управляющий символ (символы) в регулярном выражении: \ x00 no-control-regex
Алитон Оливейра
Это регулярное выражение вызовет ошибку, если строка начинается с / или (
Уолтер Монеке,
@WalterMonecke только что протестировал его на хроме - не получил ошибку. Где у тебя с этим ошибка? Спасибо
Ронен Рабинович
2

Для тех, кто хочет использовать Lodash, можно воспользоваться _.wordsфункцией:

var str = "Random String";
var wordCount = _.size(_.words(str));
console.log(wordCount);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Пенни Лю
источник
2

Точность тоже важна.

Вариант 3 в основном заменяет все пробелы, кроме любых, на a, +1а затем оценивает это, чтобы подсчитать, что 1дает вам количество слов.

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

Обратите внимание, что он медленнее, return str.split(" ").length;но точен по сравнению с Microsoft Word.

См. Файл ops / s и количество возвращенных слов ниже.

Вот ссылка для запуска этого стендового теста. https://jsbench.me/ztk2t3q3w5/1

// This is the fastest at 111,037 ops/s ±2.86% fastest
var str = "All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy.";
function WordCount(str) {
  return str.split(" ").length;
}
console.log(WordCount(str));
// Returns 241 words. Not the same as Microsoft Word count, of by one.

// This is the 2nd fastest at 46,835 ops/s ±1.76% 57.82% slower
var str = "All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy.";
function WordCount(str) {
  return str.split(/(?!\W)\S+/).length;
}
console.log(WordCount(str));
// Returns 241 words. Not the same as Microsoft Word count, of by one.

// This is the 3rd fastest at 37,121 ops/s ±1.18% 66.57% slower
var str = "All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy.";
function countWords(str) {
  var str = str.replace(/\S+/g,"\+1");
  return eval(str);
}
console.log(countWords(str));
// Returns 240 words. Same as Microsoft Word count.

// This is the slowest at 89 ops/s 17,270 ops/s ±2.29% 84.45% slower
var str = "All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy.";
function countWords(str) {
  var str = str.replace(/(?!\W)\S+/g,"1").replace(/\s*/g,"");
  return str.lastIndexOf("");
}
console.log(countWords(str));
// Returns 240 words. Same as Microsoft Word count.

Ste
источник
1

Вот функция, которая подсчитывает количество слов в HTML-коде:

$(this).val()
    .replace(/((&nbsp;)|(<[^>]*>))+/g, '') // remove html spaces and tags
    .replace(/\s+/g, ' ') // merge multiple spaces into one
    .trim() // trim ending and beginning spaces (yes, this is needed)
    .match(/\s/g) // find all spaces by regex
    .length // get amount of matches
Riki137
источник
1
let leng = yourString.split(' ').filter(a => a.trim().length > 0).length
Тим
источник
6
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода.
Isma
1

Я не уверен, было ли это сказано ранее, или это то, что здесь нужно, но не могли бы вы сделать строку массивом, а затем найти длину?

let randomString = "Random String";

let stringWords = randomString.split(' ');
console.log(stringWords.length);
brianna124
источник
1

Я думаю, что этот ответ даст все решения для:

  1. Количество символов в данной строке
  2. Количество слов в данной строке
  3. Количество строк в данной строке

 function NumberOf() { 
		 var string = "Write a piece of code in any language of your choice that computes the total number of characters, words and lines in a given text. \n This is second line. \n This is third line.";

		 var length = string.length; //No of characters
		 var words = string.match(/\w+/g).length; //No of words
		 var lines = string.split(/\r\n|\r|\n/).length; // No of lines

		 console.log('Number of characters:',length);
		 console.log('Number of words:',words);
		 console.log('Number of lines:',lines);


}

NumberOf();

  1. Сначала вам нужно найти длину данной строки по string.length
  2. Затем вы можете найти количество слов, сопоставив их со строкой string.match(/\w+/g).length
  3. Наконец, вы можете разделить каждую строку следующим образом string.length(/\r\n|\r|\n/).length

Надеюсь, это поможет тем, кто ищет эти 3 ответа.

LiN
источник
1
Превосходно. Пожалуйста, измените имя переменной stringна другое. Это сбивает с толку. Заставил меня задуматься на секунду string.match()- это статический метод. Ура.
Shy Agam
да уж!! конечно. @ShyAgam
LiN
0
<textarea name="myMessage" onkeyup="wordcount(this.value)"></textarea>
<script type="text/javascript">
var cnt;
function wordcount(count) {
var words = count.split(/\s/);
cnt = words.length;
var ele = document.getElementById('w_count');
ele.value = cnt;
}
document.write("<input type=text id=w_count size=4 readonly>");
</script>
СК Мурья
источник
0

Я знаю, что это поздно, но это регулярное выражение должно решить вашу проблему. Это будет соответствовать и вернет количество слов в вашей строке. Вместо того, которое вы отметили как решение, которое будет считать пробел-пробел-слово как 2 слова, хотя на самом деле это всего лишь 1 слово.

function countWords(str) {
    var matches = str.match(/\S+/g);
    return matches ? matches.length : 0;
}
Реальность-Торрент
источник
0

В вашем коде есть ошибки.

function WordCount(str) {
    var totalSoFar = 0;
    for (var i = 0; i < str.length; i++) {
        if (str[i] === " ") {
            totalSoFar += 1;
        }
    }
    return totalSoFar + 1; // you need to return something.
}
console.log(WordCount("Random String"));

Есть еще один простой способ использования регулярных выражений:

(text.split(/\b/).length - 1) / 2

Точное значение может отличаться примерно на 1 слово, но также учитываются границы слов без пробела, например «слово-слово.слово». И он не считает слова, не содержащие букв или цифр.

Aloso
источник
0
function totalWordCount() {
  var str ="My life is happy"
  var totalSoFar = 0;

  for (var i = 0; i < str.length; i++)
    if (str[i] === " ") { 
     totalSoFar = totalSoFar+1;
  }
  totalSoFar = totalSoFar+ 1; 
  return totalSoFar
}

console.log(totalWordCount());
Пиюша Патель
источник
Пожалуйста, добавьте несколько пояснений к редактированию вашего ответа, избегайте ответа только с кодом
GGO
0
function WordCount(str) {
    var totalSoFar = 0;
    for (var i = 1; i < str.length; i++) {
        if (str[i] === " ") {
            totalSoFar ++;
        }
    }
    return totalSoFar; 
}
console.log(WordCount("hi my name is raj));
Радж Чандак
источник
2
Ответы только на код обычно не одобряются на этом сайте. Не могли бы вы отредактировать свой ответ, включив в него некоторые комментарии или пояснения к вашему коду? Объяснения должны отвечать на такие вопросы, как: Что он делает? Как это сделать? Куда оно девается? Как это решает проблему OP? См .: Как ответить . Благодарность!
Эдуардо Байтелло