Programming-Idioms

Find how many times string s contains substring t.
Specify if overlapping occurrences are counted.
New implementation

Be concise.

Be useful.

All contributions dictatorially edited by webmasters to match personal tastes.

Please do not paste any copyright violating material.

Please try to avoid dependencies to third-party libraries and frameworks.

Other implementations
#include <string.h>
unsigned n;
for (n = 0; s = strstr(s, t); ++n, ++s)
;
(count (re-seq t s))
int SubstringCount(string s, string t, bool allowOverlap = false)
{
int p = 0;
int tl = allowOverlap ? 1 : t.Length;
int cnt = 0;

while (1 == 1)
{
p = s.IndexOf(t, p);
if (p == -1) break;
p += tl;
cnt++;
}
return cnt;
}
import std.algorithm;
auto occurrences = s.count(t);
s |> String.split(t) |> Enum.drop(1) |> length()
countOccurence(List1, List2) ->
countOccurence(List1, List2, 0).

countOccurence(_, [], Count) ->
Count;
countOccurence(List1, [_ | Rest] = List2, Count) ->
case (lists:prefix(List1, List2)) of
true ->
countOccurence(List1, Rest, Count + 1);
false ->
countOccurence(List1, Rest, Count)
end.

countOccurence("ab", "abcddababa").
lt = len(t) - 1
k = 1
num = 0
do
print *,s(k:)
i = index(s(k:),t)
if (i==0) exit
num = num + 1
k = k + i + lt
end do
print *,num
import "strings"
x := strings.Count(s, t)
sum [ 1 | r <- tails s, isPrefixOf t r ]
Data.List
length . filter (isPrefixOf t) . tails \$ s
let n = 0 // the number of occurences
let acc = s
let i
while ((i = acc.indexOf (t)) + 1) {
n++
acc = acc.slice (i + 1)
}
import org.apache.commons.lang3.StringUtils;
int count = StringUtils.countMatches(s, t);
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Pattern pattern = Pattern.compile(Pattern.quote(t));
Matcher matcher = pattern.matcher(s);
int count = 0;
while(matcher.find()) count++;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
int count = 0;
Pattern pattern = Pattern.compile(String.format("(%s)", t), Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(s);
while(matcher.find()) {
count++;
}
;;; s=str, t=pattern
(defun cnt_substr (str pattern)
(loop for i from 0 to (- (length str) (length pattern) )
sum (if (equal pattern (subseq str i (+ i (length pattern )))) 1  0 )))
\$c = substr_count(\$s , \$t);
uses strutils;
function Count(t, s: String): Integer;
var
Offset, P: Integer;
begin
Result := 0;
Offset := 1;
P := PosEx(t, s, Offset);
while P > 0 do
begin
Inc(Result);
P := PosEx(t, s, P + 1);
end;
end;
my \$t="banana bo bana bandana";

my \$c =()= \$t=~ m/ana/g;
print "count without overlap: \$c\n";

\$c =()= \$t =~ m/an(?=a)/g;
print "count with overlap: \$c\n";
count = s.count(t)
s.scan(t).size
let c = s.matches(t).count();