JAVA Как проверить, содержит ли строка & ldquo; / & rdquo; три раза или нет [дублировать]

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

Просто вставьте следующие строки в начале вашего скрипта:

  / *, если он запущен из командной строки, оберните параметры в $ _POST и $ _GET * / if (! isset ($ _ SERVER ["HTTP_HOST"])) {parse_str  ($ argv [1], $ _GET);  parse_str ($ argv [1], $ _POST);  }  

Эта небольшая часть кода делает трюк (вы можете решить, хотите ли вы использовать $ _GET или $ _POST или, как мне было нужно, оба. После изменения сценария вы можете позвонить это из командной строки, передающей ваши аргументы:

  php yourscript.php 'arg1 = x & amp; arg2 = y'  

Удачи!

460
задан TruMan1 24 October 2010 в 19:39
поделиться

23 ответа

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

var temp = "This is a string.";
var count = (temp.match(/is/g) || []).length;
console.log(count);

Это соответствует is дважды. И, если совпадений нет, он возвращает 0.

var temp = "Hello World!";
var count = (temp.match(/is/g) || []).length;
console.log(count);

751
ответ дан mzalazar 17 August 2018 в 12:38
поделиться
  • 1
    современный и элегантный, но решение Vitimtk намного более эффективно. что вы все думаете о его коде? – TruMan1 4 November 2011 в 04:15
  • 2
    Это лучше всего отвечает на вопрос. Если кто-то спросил «Как я могу сделать это в 10 раз быстрее в специальном случае (без регулярных выражений)»? Витимк выиграет этот вопрос. – Dzhaughn 16 March 2012 в 11:52
  • 3
    Спасибо за это .. Я пошел с count = (str.match(/is/g) || []).length для обработки, если у вас нет соответствия. – Matt 29 October 2012 в 14:19
  • 4
    Я не думаю, что этот ответ соответствует правильному вопросу, потому что он не принимает строку в качестве аргумента для соответствия, как описывает пример использования. Конечно, вы можете динамически создавать regexp с помощью конструктора RegExp и передавать строку, которую вы ищете, но в этом случае вам нужно избежать всех метасимволов. В этом случае предпочтительнее использовать чистый струнный подход. – ZER0 9 April 2013 в 02:47
  • 5
    Ответ Мэтта должен быть в ответе! – Senad 13 November 2013 в 17:20

Просто кодовое гольф-игра Ребекка Чернофф решение : -)

alert(("This is a string.".match(/is/g) || []).length);
7
ответ дан Andrew Myers 17 August 2018 в 12:38
поделиться
  • 1
    Это должно быть alert(("This is a string.".match(/is/g) || []).length);, иначе вы получите неопределенную ошибку, если совпадений не найдено. – Nick 12 October 2013 в 03:30

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

function occurrences (haystack, needle) {
  var _needle = needle
    .replace(/\[/g, '\\[')
    .replace(/\]/g, '\\]')
  return (
    haystack.match(new RegExp('[' + _needle + ']', 'g')) || []
  ).length
}
2
ответ дан bcherny 17 August 2018 в 12:38
поделиться

var s = "1";replaced word
var a = "HRA"; //have to replace 
var str = document.getElementById("test").innerHTML;
var count = str.split(a).length - 1;
for (var i = 0; i < count; i++) {
    var s = "1";
    var a = "HRA";
    var str = document.getElementById("test").innerHTML;
    var res = str.replace(a, s);
    document.getElementById("test").innerHTML = res;
}

<input " type="button" id="Btn_Validate" value="Validate" class="btn btn-info" />
<div class="textarea"  id="test" contenteditable="true">HRABHRA</div>

0
ответ дан Boris Schegolev 17 August 2018 в 12:38
поделиться
  • 1
    Пожалуйста, объясните, что вы сделали, избегайте только ответа кода – GGO 1 March 2018 в 09:47

Основываясь на ответе @ Vittim.us выше. Мне нравится контроль, который дает мне его метод, что упрощает его расширение, но мне нужно было добавить нечувствительность к регистру и ограничить совпадение целыми словами с поддержкой пунктуации. (например, «ванна» находится в «ванне», но не «купается»)

Регулярное выражение для пунктуации произошло из: https://stackoverflow.com/a/25575009/497745 ( Как я могу отделить все знаки препинания от строки в JavaScript с помощью regex? )

function keywordOccurrences(string, subString, allowOverlapping, caseInsensitive, wholeWord)
{

    string += "";
    subString += "";
    if (subString.length <= 0) return (string.length + 1); //deal with empty strings

    if(caseInsensitive)
    {            
        string = string.toLowerCase();
        subString = subString.toLowerCase();
    }

    var n = 0,
        pos = 0,
        step = allowOverlapping ? 1 : subString.length,
        stringLength = string.length,
        subStringLength = subString.length;

    while (true)
    {
        pos = string.indexOf(subString, pos);
        if (pos >= 0)
        {
            var matchPos = pos;
            pos += step; //slide forward the position pointer no matter what

            if(wholeWord) //only whole word matches are desired
            {
                if(matchPos > 0) //if the string is not at the very beginning we need to check if the previous character is whitespace
                {                        
                    if(!/[\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&\(\)*+,\-.\/:;<=>?@\[\]^_`{|}~]/.test(string[matchPos - 1])) //ignore punctuation
                    {
                        continue; //then this is not a match
                    }
                }

                var matchEnd = matchPos + subStringLength;
                if(matchEnd < stringLength - 1)
                {                        
                    if (!/[\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&\(\)*+,\-.\/:;<=>?@\[\]^_`{|}~]/.test(string[matchEnd])) //ignore punctuation
                    {
                        continue; //then this is not a match
                    }
                }
            }

            ++n;                
        } else break;
    }
    return n;
}

Не стесняйтесь изменять и реорганизовывать этот ответ, если вы обнаружите ошибки или улучшения .

68
ответ дан Community 17 August 2018 в 12:38
поделиться
  • 1
    Это небезопасный / неточный подход, например: countInstances("isisisisisis", "is") === 0. – Nick Craver♦ 24 October 2010 в 19:44
  • 2
    возвращает 6 для меня ... – Orbit 24 October 2010 в 19:53
  • 3
    @Antal - Похож на ошибку в предыдущей бета-версии chrome, работает после обновления до последней версии, однако я все равно избегаю этого метода. – Nick Craver♦ 24 October 2010 в 20:59
  • 4
    Это похоже на совершенно правильное решение для меня. – Gregor Schmidt 6 March 2015 в 10:36
  • 5
    @JonnyLin создает ненужные ассигнования, которые вы сразу бросаете, когда альтернативы не являются - потенциально очень большими, в зависимости от данных. – Nick Craver♦ 7 July 2015 в 00:16

Попробуйте следующее:

function countString(str, search){
    var count=0;
    var index=str.indexOf(search);
    while(index!=-1){
        count++;
        index=str.indexOf(search,index+1);
    }
    return count;
}
-1
ответ дан Diogo Arenhart 17 August 2018 в 12:38
поделиться

String.prototype.Count = function (find) { return this.split(find).length - 1; } "This is a string.".Count("is");

Это вернет 2.

3
ответ дан Fad Seck 17 August 2018 в 12:38
поделиться

Версия без регулярного выражения:

 var string = 'This is a string',
    searchFor = 'is',
    count = 0,
    pos = string.indexOf(searchFor);

while (pos > -1) {
    ++count;
    pos = string.indexOf(searchFor, ++pos);
}

console.log(count);   // 2

7
ответ дан Faraz Kelhini 17 August 2018 в 12:38
поделиться
  • 1
    Это сработало отлично! С regex сложнее, на самом деле это easylize. – hydroper 27 August 2015 в 12:50
  • 2
    1. Это только для одиночного поиска символа, слишком тонкого 2. даже OP запрашивает is вхождения – vladkras 20 May 2016 в 05:57

Вот самая быстрая функция!

Почему это быстрее?

  • Не проверяет char по char (с одним исключением)
  • Использует некоторое время и увеличивает 1 var (показатель char var) по сравнению с циклом for, проверяющим длину и увеличивая 2 vars (обычно var i и var с номером char)
  • Использует WAY less vars
  • Не использует regex!
  • Использует (надеюсь) высоко оптимизированную функцию
  • Все операции объединены, как они могут быть, избегая замедление из-за нескольких операций
    String.prototype.timesCharExist=function(c){var t=0,l=0,c=(c+'')[0];while(l=this.indexOf(c,l)+1)++t;return t};
    

Ниже представлена ​​более медленная и более читаемая версия:

    String.prototype.timesCharExist = function ( chr ) {
        var total = 0, last_location = 0, single_char = ( chr + '' )[0];
        while( last_location = this.indexOf( single_char, last_location ) + 1 )
        {
            total = total + 1;
        }
        return total;
    };

Это медленнее из-за счетчика, длинных имен переменных и неправильного использования 1 var.

Чтобы использовать его, вы просто это делаете:

    'The char "a" only shows up twice'.timesCharExist('a');

Редактировать: (2013/12/16)

НЕ использовать с Opera 12.16 или старшая! это будет почти в 2,5 раза больше, чем регулярное выражение!

На хром это решение займет от 14 мс до 20 мс для 1 000 000 символов.

Решение регулярного выражения занимает 11-14 мс для такое же количество.

Использование функции (вне String.prototype) займет около 10-13 мс.

Вот код:

    String.prototype.timesCharExist=function(c){var t=0,l=0,c=(c+'')[0];while(l=this.indexOf(c,l)+1)++t;return t};

    var x=Array(100001).join('1234567890');

    console.time('proto');x.timesCharExist('1');console.timeEnd('proto');

    console.time('regex');x.match(/1/g).length;console.timeEnd('regex');

    var timesCharExist=function(x,c){var t=0,l=0,c=(c+'')[0];while(l=x.indexOf(c,l)+1)++t;return t;};

    console.time('func');timesCharExist(x,'1');console.timeEnd('func');

результат всех решений должен быть 100 000!

Примечание: если вы хотите, чтобы эта функция подсчитывала более 1 символа, измените, где c=(c+'')[0], на c=c+''

7
ответ дан Ismael Miguel 17 August 2018 в 12:38
поделиться
  • 1
    прототипом был ПРИМЕР! Вы можете использовать эту функцию, как вам заблагорассудится! Вы можете даже сделать это: var timesFunctionExist = function (x, c) {var t = 0, l = 0, c = (c + '') [0], тогда как (l = x.indexOf (c, l) +1 ) ++ t; return t}); alert (timesCharExist ('Char & quot; a & quot; только отображается дважды ",' a ')) ;! (это ускорит немного больше, потому что я не буду возиться с прототипами). Если вы думаете, что я ошибаюсь, почему бы вам не показать это, прежде чем бросать камни в меня? Докажите мне, что моя функция отстой, и я ее приму. Покажите мне тестовый пример. И длина варов оказывает влияние на скорость. Вы можете проверить это. – Ismael Miguel 8 October 2013 в 12:02
  • 2
    Извините за долгую задержку. Проверьте изменение. – Ismael Miguel 16 December 2013 в 12:14
  • 3
    Благодаря! Я использую ваш путь, потому что он меньше использует. – hydroper 6 September 2015 в 21:35

Super duper old, но мне нужно было сделать что-то подобное сегодня и только подумать, чтобы проверить SO потом. Работает довольно быстро для меня.

String.prototype.count = function(substr,start,overlap) {
    overlap = overlap || false;
    start = start || 0;

    var count = 0, 
        offset = overlap ? 1 : substr.length;

    while((start = this.indexOf(substr, start) + offset) !== (offset - 1))
        ++count;
    return count;
};
2
ответ дан Jason Larke 17 August 2018 в 12:38
поделиться

Простая версия без регулярного выражения:

var temp = "This is a string.";

var count = (temp.split('is').length - 1);

alert(count);

1
ответ дан Jorge Alberto 17 August 2018 в 12:38
поделиться

Немного поздно, но предположим, что у нас есть следующая строка:

var temp = "This is a string.";

Сначала мы раскалываем все, что вы хотите совместить, это вернет массив строк.

var array = temp.split("is");

Затем мы получаем длину и вычитаем 1 из него, так как split по умолчанию относится к массиву размера 1 и, следовательно, увеличивает его размер каждый раз, когда он находит событие.

var occurrenceCount = array.length - 1;
alert(occurrenceCount); //should output '2'

Вы может также сделать все это в одной строке следующим образом:

alert("This is a string.".split("is").length - 1); //should output '2'

Надеюсь, что это поможет: D

0
ответ дан Juan Enrique Segebre 17 August 2018 в 12:38
поделиться
  • 1
    Могу ли я отметить это как дублированный ответ? Может быть, вы должны прочитать все ответы, прежде чем предоставлять свои собственные? – Michiel 29 May 2018 в 12:16
  • 2
  • 3
    – Juan Enrique Segebre 26 October 2018 в 21:45

var countInstances = function(body, target) {
  var globalcounter = 0;
  var concatstring  = '';
  for(var i=0,j=target.length;i<body.length;i++){
    concatstring = body.substring(i-1,j);
    
    if(concatstring === target){
       globalcounter += 1;
       concatstring = '';
    }
  }
  
  
  return globalcounter;
 
};

console.log(   countInstances('abcabc', 'abc')   ); // ==> 2
console.log(   countInstances('ababa', 'aba')   ); // ==> 2
console.log(   countInstances('aaabbb', 'ab')   ); // ==> 1

0
ответ дан Kamal 17 August 2018 в 12:38
поделиться

Ответа на этот вопрос Leandro Batista: просто проблема с выражением регулярного выражения.

 "use strict";
 var dataFromDB = "testal";
 
  $('input[name="tbInput"]').on("change",function(){
	var charToTest = $(this).val();
	var howManyChars = charToTest.length;
	var nrMatches = 0;
	if(howManyChars !== 0){
		charToTest = charToTest.charAt(0);
		var regexp = new RegExp(charToTest,'gi');
		var arrMatches = dataFromDB.match(regexp);
		nrMatches = arrMatches ? arrMatches.length : 0;
	}
		$('#result').html(nrMatches.toString());

  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="main">
What do you wanna count <input type="text" name="tbInput" value=""><br />
Number of occurences = <span id="result">0</span>
</div>

0
ответ дан PhilMaGeo 17 August 2018 в 12:38
поделиться

function get_occurrence(varS,string){//Find All Occurrences
        c=(string.split(varS).length - 1);
        return c;
    }
    temp="This is a string.";
    console.log("Total Occurrence is "+get_occurrence("is",temp));

Используйте get_occurrence (varS, string), чтобы найти вхождения обоих символов и строки в String.

2
ответ дан Rahul Ranjan 17 August 2018 в 12:38
поделиться
       var myString = "This is a string.";
        var foundAtPosition = 0;
        var Count = 0;
        while (foundAtPosition != -1)
        {
            foundAtPosition = myString.indexOf("is",foundAtPosition);
            if (foundAtPosition != -1)
            {
                Count++;
                foundAtPosition++;
            }
        }
        document.write("There are " + Count + " occurrences of the word IS");

Обратите внимание: - подсчет подстроки отображается в строке для пошагового объяснения.

2
ответ дан Roney Michael 17 August 2018 в 12:38
поделиться

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

var search_value = "This is a dummy sentence!";
var letter = 'a'; /*Can take any letter, have put in a var if anyone wants to use this variable dynamically*/
letter = letter[letter.length - 1];
var count;
for (var i = count = 0; i < search_value.length; count += (search_value[i++] == letter));
console.log(count);

Я не уверен, что это самое быстрое решение, но я предпочел его для простоты и не использовал regex (я просто не люблю их использовать!) [/ ​​g4]

61
ответ дан Ruslan López 17 August 2018 в 12:38
поделиться
  • 1
    рад, что я прокрутил вниз для этого! – shak 20 October 2013 в 23:19
  • 2
    я тоже! Простое элегантное решение. Прекрасно работает. – Christian Dechery 5 December 2013 в 22:52
  • 3
    возможно, было бы лучше вернуться (str.match (regExp) || []). length; Таким образом, вы дважды не оцениваете регулярное выражение? – aikeru 7 December 2013 в 06:08
  • 4
    вам также нужно избегать строки или countOcurrences('Hello...','.')==8, а не 3 – Vitim.us 9 May 2014 в 04:16
  • 5
    Мой любимый! – MrWashinton 5 May 2015 в 20:26
  • 6
    +1 для простоты и потому, что в соответствии с моими испытаниями это решение работает на скорости ~ 10x быстрее , чем остальные! – Claudio Holanda 18 May 2015 в 14:23
  • 7
    Например, у меня есть два "is" как вы получаете позицию каждого? – rapidoodle 28 October 2016 в 02:50
  • 8
    Как обсуждалось в ответе @Orbit, люди получают разные результаты в более старых версиях Chrome. Возможно, я бы немного осторожно использовал этот метод. – mgthomas99 9 December 2016 в 16:13
  • 9
    И вы также можете использовать его с переменными: theString.split(myvar).length - 1, которые вы не можете использовать с простым регулярным выражением – Steffan 6 November 2017 в 22:53

Попробуйте

<?php 
$str = "33,33,56,89,56,56";
echo substr_count($str, '56');
?>

<script type="text/javascript">
var temp = "33,33,56,89,56,56";
var count = temp.match(/56/g);  
alert(count.length);
</script>
1
ответ дан The Clouds 17 August 2018 в 12:38
поделиться
/** Function that count occurrences of a substring in a string;
 * @param {String} string               The string
 * @param {String} subString            The sub string to search for
 * @param {Boolean} [allowOverlapping]  Optional. (Default:false)
 *
 * @author Vitim.us https://gist.github.com/victornpb/7736865
 * @see Unit Test https://jsfiddle.net/Victornpb/5axuh96u/
 * @see http://stackoverflow.com/questions/4009756/how-to-count-string-occurrence-in-string/7924240#7924240
 */
function occurrences(string, subString, allowOverlapping) {

    string += "";
    subString += "";
    if (subString.length <= 0) return (string.length + 1);

    var n = 0,
        pos = 0,
        step = allowOverlapping ? 1 : subString.length;

    while (true) {
        pos = string.indexOf(subString, pos);
        if (pos >= 0) {
            ++n;
            pos += step;
        } else break;
    }
    return n;
}

Использование

occurrences("foofoofoo", "bar"); //0

occurrences("foofoofoo", "foo"); //3

occurrences("foofoofoo", "foofoo"); //1

allowOverlapping

occurrences("foofoofoo", "foofoo", true); //2

Совпадения:

  foofoofoo
1 `----´
2    `----´

Единичный тест

Benchmark

Я проверил тестовый тест и моя функция более чем в 10 раз быстрее, чем функция соответствия регулярному выражению, отправленная gumbo. В моей тестовой строке длина 25 символов. с 2 вхождениями символа 'o'. Я выполнил 1 000 000 раз в Safari.

Safari 5.1

Benchmark> Общее время исполнения: 5617 ms (regexp)

Benchmark> Общее время исполнения: 881 ms (моя функция в 6.4 раза быстрее)

Firefox 4

Benchmark> Общее время исполнения: 8547 мс (Rexexp)

Benchmark> Общее время исполнения: 634 мс (моя функция на 13,5 раз быстрее)


Изменить: изменения, которые я сделал

  • длина кешированной кешировки
  • добавлена ​​листинг типа в строку .
  • добавлен дополнительный параметр «allowOverlapping»
  • исправленный правильный вывод для «пустого случая подстроки».
Gist
189
ответ дан Vitim.us 17 August 2018 в 12:38
поделиться
  • 1
    +1 для приведения в движение назад! (и быстро) – Evan Moran 4 January 2012 в 03:01
  • 2
    Я повторил этот тест в Safari 5 и получил аналогичные результаты с небольшой (100b) строкой, но с более крупной строкой (16kb) регулярное выражение работает быстрее для меня. В течение одной итерации (не 1 000 000) разница была меньше миллисекунды, так что мой голос переходит к регулярному выражению. – arlomedia 5 April 2012 в 00:04
  • 3
    +1, но вы проверяете substring.length почти на каждый цикл, вы должны рассмотреть его кеширование вне while – ajax333221 7 June 2012 в 00:22
  • 4
    Я нашел ваш код, используемый здесь: success-equation.com/mind_reader.html . Действительно хороший программист решил поставить ссылку там. – Bruno Kim 9 October 2012 в 03:57
  • 5
    @ Даниэль Зузевич будет принуждать типы к String , если вы делаете occurrences(11,1) //2, и он все равно будет работать. (Это делается быстрее, чем проверка типов и вызов toString () ). – Vitim.us 7 June 2017 в 18:52

Вы можете использовать match для определения такой функции:

String.prototype.count = function(search) {
    var m = this.match(new RegExp(search.toString().replace(/(?=[.\\+*?[^\]$(){}\|])/g, "\\"), "g"));
    return m ? m.length:0;
}
17
ответ дан webXL 17 August 2018 в 12:38
поделиться
  • 1
    Если вы хотите, чтобы он был однородным с семантикой поиска JS, обратной линией будет return m ? m.length:-1;. – Conor O'Brien 20 December 2014 в 04:13
  • 2
    Это лучше, чем другие решения регулярных выражений выше, потому что они вызывают ошибку, если строка для подсчета вхождений имеет значение "[& quot; или что-либо со специальным значением в Regex. – programmer5000 25 February 2017 в 17:03
69
ответ дан Community 6 September 2018 в 09:12
поделиться
64
ответ дан Ruslan López 6 September 2018 в 09:12
поделиться
64
ответ дан Ruslan López 29 October 2018 в 15:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: