Підрахунок слів у рядку


91

Я намагався порахувати слова в тексті таким чином:

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

Або, str.split(' ')а потім підрахувати ті, які не є рядками довжиною 0?
Katie Kilian

8
string.split ('') .length не працює. Пробіли - це не завжди межі слів! Що робити, якщо між двома словами є більше одного пробілу? Що стосовно ". . ." ?
Aloso

Як сказав Алосо, цей метод не працює.
Reality-Torrent

1
@ Reality-Torrent Це стара публікація.
cst1992

Відповіді:


107

Використовуйте квадратні дужки, а не дужки:

str[i] === " "

Або charAt:

str.charAt(i) === " "

Ви також можете зробити це за допомогою .split():

return str.split(' ').length;

Думаю, я зрозумів, що ви кажете, чи мій код вище в відредагованому оригінальному запитанні виглядає нормально?

чи працює ваше рішення там, де слова розмежовуються чимось іншим, крім пробілу? Скажіть за новими рядками чи вкладками?
nemesisfixx

7
@Blender хороше рішення, але це може дати неправильний результат для подвійних пробілів, пропущених у рядку ..
ipalibowhyte

95

Спробуйте їх, перш ніж винаходити колеса

з Підрахувати кількість слів у рядку за допомогою 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
}

від Використовуйте 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.замінити (/ \ n /, "\ n"); що означає кожен рядок? вибачте, що так нужденний

що-небудь? цей код дуже заплутаний, і той веб-сайт, який ви буквально скопіювали та вставили з нього, зовсім не корисний. Я просто переплутав більше, ніж що-небудь, що я отримую, що його слід перевіряти на слова без пробілів наші подвійні пробіли, але як? просто мільйон випадково розміщених символів насправді не допомагає ...

Ось приємно все, про що я просив, - пояснити свій код, який ти написав. Я ніколи раніше не бачив синтаксису і хотів знати, що це означає. Це нормально, я зробив окреме запитання, і хтось глибоко відповів на моє запитання. Вибачте, що попросив стільки.

1
str.split (/ \ s + /). довжина насправді не працює як є: кінцевий пробіл трактується як інше слово.
Ян

2
Зверніть увагу, що він повертає 1 для порожнього вводу.
pie6k

21

Ще один спосіб порахувати слова в рядку. Цей код враховує слова, що містять лише буквено-цифрові символи та символи "_", "'", "-", "'".

function countWords(str) {
  var matches = str.match(/[\w\d\’\'-]+/gi);
  return matches ? matches.length : 0;
}

2
Можна також подумати про додавання, ’'-щоб "котяче нявкання" не враховувалось як 3 слова. І "посередині"
mpen

@mpen дякую за пропозицію. Відповідно до нього я оновив свою відповідь.
Алекс

Перший символ у моєму рядку - це
правопис

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;

1
потенційне місце, де може статися помилка, якщо рядок порожній
Purkhalo Alex

5

На сьогодні найпростіший спосіб - це використання регулярного виразу з split.

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

Ось мій підхід, який просто розбиває рядок на пробіли, а потім для циклів масиву і збільшує кількість, якщо масив [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)

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

Вгорі str повертає 10, що правильно!


Деякі мови не використовувати [A-Za-z]взагалі
David

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 слова,

(деякі інші поради, які я спробував, вважають кожен приклад вище лише 1 х словом) це також:

  • ігнорує всі пробіли, що ведуть та відстають

  • підраховує одну букву, за якою йде новий рядок, як слово - що, як я виявив, деякі пропозиції на цій сторінці не враховуються, наприклад:
    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
Складний регулярний вираз - це мистецтво чаклунства. Заклинання, яке ми вчимося вимовляти, але ніколи не маємо сміливості запитувати, чому. Дякую, що поділився.
Блез

^ це дивовижна цитата
r3wt

Я отримую цю помилку: помилка Несподівані символи керування в регулярному виразі: \ x00 no-control-regex
Aliton Oliveira

Цей регулярний вираз видасть помилку, якщо рядок починається з / або (
Вальтер Монеке

@WalterMonecke щойно перевірив його на chrome - помилка не з’явилася. Де ви отримали помилку з цим? Дякую
Ронен Рабіновичі

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

Це допоможе вирішити всі випадки і є максимально ефективним. (Ви не хочете розділяти (''), якщо заздалегідь не знаєте, що немає пробілів більшої довжини, ніж один.):

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

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

1
let leng = yourString.split(' ').filter(a => a.trim().length > 0).length

6
Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду.
Ісма

1

Я не впевнений, що це було сказано раніше, чи це те, що тут потрібно, але чи не могли б ви зробити рядок масивом, а потім знайти довжину?

let randomString = "Random String";

let stringWords = randomString.split(' ');
console.log(stringWords.length);

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 відповіді.


1
Відмінно. Будь ласка, змініть назву змінної stringна щось інше. Це бентежить. Змусив мене на секунду подумати string.match()- це статичний метод. Ура.
Сором'язливий

так !! звичайно. @ShyAgam
LiN

1

Точність також важлива.

Те, що робить варіант 3, в основному замінює всі пробіли, крім будь-яких, пробілами, +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.


1
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? Дивіться: Як відповісти . Дякую!
Едуардо Баїтло

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 слова, але воно також враховує межі слів без пробілу, наприклад "word-word.word". І це не враховує слів, які не містять літер або цифр.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.