Ответ 1
Используйте квадратные скобки, а не круглые скобки:
str[i] === " "
Или charAt
:
str.charAt(i) === " "
Вы также можете сделать это с помощью .split()
:
return str.split(' ').length;
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
неверна. Как я могу сказать, что if(str(i)
содержит пробел, добавьте 1.
Edit:
Я узнал (спасибо Blender), что могу сделать это с гораздо меньшим количеством кода:
function WordCount(str) {
return str.split(" ").length;
}
console.log(WordCount("hello world"));
Используйте квадратные скобки, а не круглые скобки:
str[i] === " "
Или charAt
:
str.charAt(i) === " "
Вы также можете сделать это с помощью .split()
:
return str.split(' ').length;
Попробуйте сделать это, прежде чем изобретать колеса
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(' ').length;
}
Примечания от автора:
Вы можете адаптировать этот script для подсчета слов в зависимости от того, что вам нравится. Важной частью является s.split('').length - это считается пространства. script пытается удалить все лишние пробелы (пробелы и т.д.) Перед подсчетом. Если текст содержит два слова без пробела между ними, он будет считать их одним словом, например. "Первое предложение. Следующее предложение".
Еще один способ подсчета слов в строке. Этот код подсчитывает слова, содержащие только буквенно-цифровые символы и "_" char.
function countWords(str) {
var matches = str.match(/[\w\d]+/gi);
return matches ? matches.length : 0;
}
После очистки строки вы можете совместить символы без пробелов или границы слов.
Вот два простых регулярных выражения для записи слов в строке:
/\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; }
Я думаю, что этот метод больше, чем вы хотите
var getWordCount = function(v){
var matches = v.match(/\S+/g) ;
return matches?matches.length:0;
}
Самый простой способ, который я нашел до сих пор, - использовать регулярное выражение с разделом.
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
String.prototype.match
возвращает массив, мы можем проверить длину,
Я считаю, что этот метод является наиболее описательным
var str = 'one two three four five';
str.match(/\w+/g).length;
Ответ, заданный @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;
}
<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>
У вас есть некоторые ошибки в вашем коде.
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". И он не учитывает слова, которые не содержат букв или цифр.
Я знаю его поздно, но это регулярное выражение должно решить вашу проблему. Это будет соответствовать и возвращать количество слов в вашей строке. Вместо этого вы отметили как решение, которое считало бы пространственно-косвенное слово как 2 слова, хотя его действительно всего одно слово.
function countWords(str) {
var matches = str.match(/\S+/g);
return matches ? matches.length : 0;
}
Может быть более эффективный способ сделать это, но это то, что сработало для меня.
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 x слово) это также:
игнорирует все начальные и конечные пробелы
подсчитывает одну букву, за которой следует новая строка, в качестве слова - я нашел некоторые предложения, приведенные на этой странице, не учитываются, например:
иногда подсчитывается как 0 x слов, а другие функции считают только 1 x word вместо 5 x слов)
если у кого-нибудь есть идеи о том, как его улучшить, или более чистых/более эффективных - тогда, пожалуйста, добавьте 2 цента! Надежда Это помогает кому-то.
Здесь функция, которая подсчитывает количество слов в HTML-коде:
$(this).val()
.replace(/(( )|(<[^>]*>))+/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
function countWords(str) {
var regEx = /([^\u0000-\u007F]|\w)+/g;
return str.match(regEx).length;
}
Объяснение:
/([^\u0000-\u007F]|\w)
соответствует символам слов - это замечательно → регулярное выражение делает тяжелый подъем для нас. (Этот шаблон основан на следующем ответе SO: fooobar.com/questions/38508/... by @Landeeyo)
+
соответствует всей строке ранее заданных символов слова, поэтому мы в основном группируем слова.
/g
означает, что он продолжает искать до конца.
str.match(regEx)
возвращает массив найденных слов - поэтому мы рассчитываем его длину.
let leng = yourString.split(' ').filter(a => a.trim().length > 0).length