Compter les mots dans une chaîne

93

J'essayais de compter les mots dans un texte de cette manière:

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"));

Je pense avoir assez bien compris cela, sauf que je pense que la ifdéclaration est fausse. La partie qui vérifie si str(i)contient un espace et ajoute 1.

Éditer:

J'ai découvert (grâce à Blender) que je pouvais faire cela avec beaucoup moins de code:

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

console.log(WordCount("hello world"));
Valerio Bozz
la source
Ne serait-ce pas str.split(' ').lengthune méthode plus simple? jsfiddle.net/j08691/zUuzd
j08691
Ou str.split(' ')puis compter ceux qui ne sont pas des chaînes de 0 longueur?
Katie Kilian
8
string.split ('') .length ne fonctionne pas. Les espaces ne sont pas toujours des frontières de mots! Et s'il y a plus d'un espace entre deux mots? Qu'en est-il de ". . ." ?
Aloso
Comme l'a dit Aloso, cette méthode ne fonctionnera pas.
Reality-Torrent
1
@ Reality-Torrent Ceci est un ancien message.
cst1992

Réponses:

109

Utilisez des crochets et non des parenthèses:

str[i] === " "

Ou charAt:

str.charAt(i) === " "

Vous pouvez également le faire avec .split():

return str.split(' ').length;
Mixeur
la source
Je pense avoir compris ce que vous dites. Mon code ci-dessus dans la question originale modifiée semble-t-il correct?
votre solution fonctionnerait-elle là où les mots sont délimités par autre chose que le caractère espace? Dire par nouvelles lignes ou onglets?
nemesisfixx
7
@Blender bonne solution mais cela peut donner le mauvais résultat pour les doubles espaces omis dans une chaîne ..
ipalibowhyte
95

Essayez-les avant de réinventer les roues

à partir du nombre de mots dans la chaîne en utilisant JavaScript

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

depuis 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 Utiliser JavaScript pour compter les mots dans une chaîne, SANS utiliser une regex - ce sera la meilleure approche

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

Notes de l'auteur:

Vous pouvez adapter ce script pour compter les mots comme vous le souhaitez. La partie importante est s.split(' ').length- cela compte les espaces. Le script tente de supprimer tous les espaces supplémentaires (doubles espaces, etc.) avant de compter. Si le texte contient deux mots sans espace entre eux, il les comptera comme un seul mot, par exemple "Première phrase. Début de la phrase suivante".

interne
la source
Je n'ai jamais vu cette syntaxe: s = s.replace (/ (^ \ s *) | (\ s * $) / gi, ""); s = s.replace (/ [] {2,} / gi, ""); s = s. remplacer (/ \ n /, "\ n"); que signifie chaque ligne? désolé d'être si nécessiteux
n'importe quoi? ce code est très déroutant et le site Web que vous avez littéralement copié et collé n'est pas du tout utile. Je suis juste confus plus que tout, je comprends que c'est censé vérifier les mots sans espaces nos doubles espaces mais comment? juste un million de caractères placés au hasard n'aide vraiment pas ...
C'est bien tout ce que je demandais, c'est que vous expliquiez votre code que vous avez écrit. Je n'ai jamais vu la syntaxe auparavant et je voulais savoir ce qu'elle signifiait. C'est normal, j'ai posé une question distincte et quelqu'un a répondu à ma question en profondeur. Désolé d'avoir tant demandé.
1
str.split (/ \ s + /). length ne fonctionne pas vraiment tel quel: l'espace blanc de fin est traité comme un autre mot.
Ian
2
Notez qu'il renvoie 1 pour une entrée vide.
pie6k
21

Une autre façon de compter les mots dans une chaîne. Ce code compte les mots qui contiennent uniquement des caractères alphanumériques et des caractères "_", "'", "-", "'".

function countWords(str) {
  var matches = str.match(/[\w\d\’\'-]+/gi);
  return matches ? matches.length : 0;
}
Alex
la source
2
Pourrait également envisager d'ajouter ’'-pour que "Cat's meow" ne compte pas pour 3 mots. Et "entre les deux"
mpen
@mpen merci pour la suggestion. J'ai mis à jour ma réponse en fonction de cela.
Alex
Le premier caractère de ma chaîne est un guillemet droit FYI, pas un backtick :-D
mpen
1
Vous n'avez pas besoin de vous échapper ’'dans une regex. Utilisez /[\w\d’'-]+/gipour éviter les avertissements ESLint no-useless-escape
Stefan Blamberg
18

Après avoir nettoyé la chaîne, vous pouvez faire correspondre les caractères non blancs ou les limites de mots.

Voici deux expressions régulières simples pour capturer des mots dans une chaîne:

  • Séquence de caractères sans espace blanc: /\S+/g
  • Caractères valides entre les limites des mots: /\b[a-z\d]+\b/g

L'exemple ci-dessous montre comment récupérer le nombre de mots d'une chaîne, en utilisant ces modèles de capture.

/*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; }


Trouver des mots uniques

Vous pouvez également créer un mappage de mots pour obtenir des nombres uniques.

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>

M. Polywhirl
la source
1
C'est une réponse géniale et complète. Merci pour tous les exemples, ils sont vraiment utiles!
Connor
14

Je pense que cette méthode est plus que ce que vous voulez

var getWordCount = function(v){
    var matches = v.match(/\S+/g) ;
    return matches?matches.length:0;
}
Sean
la source
7

String.prototype.match retourne un tableau, on peut alors vérifier la longueur,

Je trouve que cette méthode est la plus descriptive

var str = 'one two three four five';

str.match(/\w+/g).length;
iamwhitebox
la source
1
endroit potentiel pour se produire une erreur si la chaîne est vide
Purkhalo Alex
5

Le moyen le plus simple que j'ai trouvé jusqu'à présent est d'utiliser une regex avec 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

Tim
la source
3

La réponse donnée par @ 7-isnotbad est extrêmement proche, mais ne compte pas les lignes d'un seul mot. Voici le correctif, qui semble tenir compte de toutes les combinaisons possibles de mots, d'espaces et de nouvelles lignes.

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; 
}
neokio
la source
3

Voici mon approche, qui divise simplement une chaîne par des espaces, puis for boucle le tableau et augmente le nombre si le tableau [i] correspond à un modèle d'expression régulière donné.

    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
    }

Invoqué comme ça:

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

(ajout de caractères et d'espaces supplémentaires pour montrer la précision de la fonction)

La chaîne ci-dessus renvoie 10, ce qui est correct!

user3743140
la source
Certaines langues n'utilisent pas [A-Za-z]du tout
David
3

Cela traitera tous les cas et sera aussi efficace que possible. (Vous ne voulez pas de split ('') sauf si vous savez à l'avance qu'il n'y a pas d'espaces de longueur supérieure à un.):

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
WesleyAC
la source
2

Il existe peut-être un moyen plus efficace de le faire, mais c'est ce qui a fonctionné pour moi.

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;

}

il est capable de reconnaître tous les éléments suivants comme des mots séparés:

abc,abc= 2 mots,
abc/abc/abc= 3 mots (fonctionne avec des barres obliques avant et arrière),
abc.abc= 2 mots,
abc[abc]abc= 3 mots,
abc;abc= 2 mots,

(certaines autres suggestions que j'ai essayées comptent chaque exemple ci-dessus comme un seul mot).

  • ignore tous les espaces blancs de début et de fin

  • compte une seule lettre suivie d'une nouvelle ligne, comme un mot - que j'ai trouvé que certaines des suggestions données sur cette page ne comptent pas, par exemple:
    a
    a
    a
    a
    a est
    parfois compté comme 0 x mot, et les autres fonctions ne le comptent que comme 1 x mot, au lieu de 5 x mots)

si quelqu'un a des idées sur la façon de l'améliorer, ou plus propre / plus efficace - alors ajoutez-vous 2 cents! J'espère que cela aide quelqu'un.

tourneur
la source
2
function countWords(str) {
    var regEx = /([^\u0000-\u007F]|\w)+/g;  
    return str.match(regEx).length;
}

Explication:

/([^\u0000-\u007F]|\w)correspond aux caractères de mots - ce qui est génial -> regex fait le gros du travail pour nous. (Ce modèle est basé sur la réponse SO suivante: https://stackoverflow.com/a/35743562/1806956 par @Landeeyo)

+ correspond à la chaîne entière des caractères de mot spécifiés précédemment - nous regroupons donc essentiellement les caractères de mot.

/g signifie qu'il continue de chercher jusqu'à la fin.

str.match(regEx) renvoie un tableau des mots trouvés - nous comptons donc sa longueur.

Ronen Rabinovici
la source
1
La regex compliquée est l'art de la sorcellerie. Un sort que nous apprenons à prononcer, mais que nous n'avons jamais le courage de demander pourquoi. Merci pour le partage.
Blaise
^ c'est une citation géniale
r3wt
Je reçois cette erreur: erreur Caractère (s) de contrôle inattendu dans l'expression régulière: \ x00 no-control-regex
Aliton Oliveira
Cette expression régulière affichera une erreur si la chaîne commence par / ou (
Walter Monecke
@WalterMonecke vient de le tester sur chrome - n'a pas obtenu l'erreur. Où avez-vous eu une erreur avec cela? Merci
Ronen Rabinovici
2

Pour ceux qui souhaitent utiliser Lodash peuvent utiliser la _.wordsfonction:

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>

Penny Liu
la source
2

La précision est également importante.

L'option 3 remplace essentiellement tous les espaces, sauf tous, par un +1, puis évalue cela pour compter les 1's en vous donnant le nombre de mots.

C'est la méthode la plus précise et la plus rapide des quatre que j'ai faites ici.

Veuillez noter qu'il est plus lent que, return str.split(" ").length;mais il est précis par rapport à Microsoft Word.

Voir le fichier ops / s et le nombre de mots retournés ci-dessous.

Voici un lien pour exécuter ce test au banc. 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
la source
1

Voici une fonction qui compte le nombre de mots dans un code 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
la source
1
let leng = yourString.split(' ').filter(a => a.trim().length > 0).length
Tim
la source
6
Bien que cet extrait de code puisse résoudre la question, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
Isma
1

Je ne sais pas si cela a été dit précédemment, ou si c'est ce qui est nécessaire ici, mais ne pourriez-vous pas faire de la chaîne un tableau et trouver la longueur?

let randomString = "Random String";

let stringWords = randomString.split(' ');
console.log(stringWords.length);
brianna124
la source
1

Je pense que cette réponse donnera toutes les solutions pour:

  1. Nombre de caractères dans une chaîne donnée
  2. Nombre de mots dans une chaîne donnée
  3. Nombre de lignes dans une chaîne donnée

 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. Vous devez d'abord trouver la longueur de la chaîne donnée par string.length
  2. Ensuite, vous pouvez trouver le nombre de mots en les faisant correspondre avec une chaîne string.match(/\w+/g).length
  3. Enfin, vous pouvez diviser chaque ligne comme ceci string.length(/\r\n|\r|\n/).length

J'espère que cela peut aider ceux qui recherchent ces 3 réponses.

LiN
la source
1
Excellent. Veuillez changer le nom stringde la variable en autre chose. C'est confu. Cela m'a fait penser une seconde string.match()est une méthode statique. À votre santé.
Shy Agam le
Ouais!! sûr. @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>
Sk Mourya
la source
0

Je sais que c'est tard mais cette regex devrait résoudre votre problème. Cela correspondra et retournera le nombre de mots dans votre chaîne. Plutôt celui que vous avez marqué comme solution, qui compterait le mot espace-espace comme 2 mots même s'il ne s'agit en réalité que d'un seul mot.

function countWords(str) {
    var matches = str.match(/\S+/g);
    return matches ? matches.length : 0;
}
Réalité-Torrent
la source
0

Vous avez des erreurs dans votre code.

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"));

Il existe un autre moyen simple d'utiliser des expressions régulières:

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

La valeur exacte peut différer d'environ 1 mot, mais elle compte également les bordures de mots sans espace, par exemple "mot-mot.word". Et il ne compte pas les mots qui ne contiennent ni lettres ni chiffres.

Aloso
la source
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());
Piyusha Patel
la source
Veuillez ajouter quelques explications en modifiant votre réponse, évitez la réponse code uniquement
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));
Raj Chandak
la source
2
Les réponses au code uniquement sont généralement mal vues sur ce site. Pourriez-vous s'il vous plaît modifier votre réponse pour inclure des commentaires ou une explication de votre code? Les explications doivent répondre à des questions telles que: que fait-il? Comment ça marche? Où est-ce que ça va? Comment résout-il le problème d'OP? Voir: Comment répondre . Merci!
Eduardo Baitello