Count occurrences of a substring: Difference between revisions
m
syntax highlighting fixup automation
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
|||
Line 10:
It should return an integer count.
<
3
// do not count substrings that overlap with previously-counted substrings:
print countSubstring("ababababab","abab")
2</
The matching should yield the highest number of non-overlapping matches.
Line 26:
=={{header|11l}}==
<
print(‘ababababab’.count(‘abab’))</
{{out}}
Line 37:
=={{header|360 Assembly}}==
The program uses two ASSIST macros (XDECO,XPRNT) to keep the code as short as possible.
<
COUNTSTR CSECT
USING COUNTSTR,R13 base register
Line 102:
* ---- -------------------------------------------------------
YREGS
END COUNTSTR</
{{out}}
<pre>
Line 115:
<code>DE</code>.
<
jmp demo
;;; Count non-overlapping substrings (BC) in string (HL)
Line 170:
sub2: db 'abab',0 ; result should be 2
str3: db 'cat',0
sub3: db 'dog',0 ; result should be 0</
{{out}}
Line 177:
=={{header|8086 Assembly}}==
<
org 100h
section .text
Line 242:
.sub2: db 'abab',0 ; result should be 2
.str3: db 'cat',0
.sub3: db 'dog',0 ; result should be 0</
{{out}}
Line 249:
=={{header|Action!}}==
<
BYTE i,j,res,found
Line 285:
Test("11111111","11")
Test("abcdefg","123")
RETURN</
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Count_occurrences_of_a_substring.png Screenshot from Atari 8-bit computer]
Line 296:
=={{header|Ada}}==
<
procedure Substrings is
Line 304:
Ada.Integer_Text_IO.Put (Ada.Strings.Fixed.Count (Source => "ababababab",
Pattern => "abab"));
end Substrings;</
{{out}}
Line 314:
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}}
Algol68 has no build in function to do this task, hence the next to create a ''count string in string'' routine.
<
PROC count string in string = (STRING needle, haystack)INT: (
Line 330:
count string in string("a*b", "abaabba*bbaba*bbab"), # expect 2 #
$l$
))</
<pre>
Line 338:
=={{header|Apex}}==
Apex example for 'Count occurrences of a substring'.
<syntaxhighlight lang="apex">
String substr = 'ABC';
String str = 'ABCZZZABCYABCABCXXABC';
Line 350:
}
System.debug('Count String : '+count);
</syntaxhighlight>
<pre>
Line 359:
{{works with|Dyalog APL}}
<
{{out}}
Line 375:
Here we use a generic ''evalOSA(language, code)'' function to apply a JavaScript for Automation regex to a pair of AppleScript strings, using OSAKit.
<
on run
Line 403:
return oError's NSLocalizedDescription as text
end evalOSA</
{{out}}
Line 412:
The above assertions notwithstanding, it's always been possible to use AppleScript's text item delimiters for this purpose with its native strings, except that the TIDs have only observed the current considering/ignoring state with the 'unicode text' class, which was introduced around Mac OS X 10.4 and became AppleScript's only native text class with the introduction of AppleScript 2.0 in Mac OS X 10.5.
<
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to theSubstring
Line 421:
end countSubstring
{countSubstring("the three truths", "th"), countSubstring("ababababab", "abab")}</
{{Out}}
<syntaxhighlight lang
=={{header|Arturo}}==
<
loop [["the three truths" "th"] ["ababababab" "abab"]] 'pair ->
Line 434:
~"occurrences of '|last pair|' in '|first pair|':"
countOccurrences first pair last pair
]</
{{out}}
Line 445:
AutoHotkey has a rather unconventional method which outperforms this.
StringReplace sets the number of replaced strings to ErrorLevel.
<
MsgBox % countSubstring("ababababab","abab") ; 2
Line 451:
StringReplace, junk, fullstring, %substring%, , UseErrorLevel
return errorlevel
}</
=={{header|AWK}}==
<syntaxhighlight lang="awk">#
# countsubstring(string, pattern)
# Returns number of occurrences of pattern in string
Line 484:
print countsubstring_regex("[do&d~run?d!run&>run&]", "run[&]")
print countsubstring("the three truths","th")
}</
{{out}}
<pre>$ awk -f countsubstring.awk
Line 493:
=={{header|BaCon}}==
<
LOCAL x
WHILE TALLY(text$, part$)
Line 503:
PRINT "the three truths - th: ", Uniq_Tally("the three truths", "th")
PRINT "ababababab - abab: ", Uniq_Tally("ababababab", "abab")</
{{out}}
<pre>
Line 515:
In FreeBASIC, this needs to be compiled with <code>-lang qb</code> or <code>-lang fblite</code>.
<
PRINT "the three truths, th:", countSubstring&("the three truths", "th")
Line 529:
LOOP
countSubstring = c
END FUNCTION</
{{out}}
Line 538:
==={{header|Applesoft BASIC}}===
<
20 S$ = "THE THREE TRUTHS"
30 GOSUB 100"COUNT SUBSTRING
Line 557:
170 IF F$ = MID$(S$, I, F) THEN R = R + 1 : I = I + F - 1
180 NEXT I
190 RETURN</
==={{header|IS-BASIC}}===
<
110 INPUT PROMPT "Substring: ":SUB$
120 PRINT COUNT(LCASE$(TXT$),LCASE$(SUB$))
Line 570:
180 LOOP UNTIL PO=0
190 LET COUNT=N
200 END DEF</
==={{header|Sinclair ZX81 BASIC}}===
Works with 1k of RAM.
<
20 LET U$="TH"
30 GOSUB 100
Line 590:
150 LET N=N+1
160 LET I=I+LEN U$
170 GOTO 130</
==={{header|True BASIC}}===
{{trans|QBasic}}
<
LET c = 0
LET s = 1-LEN(what$)
Line 607:
PRINT "the three truths, th:", countSubstring("the three truths", "th")
PRINT "ababababab, abab:", countSubstring("ababababab", "abab")
END</
==={{header|BASIC256}}===
{{trans|Run BASIC}}
<
print countSubstring("ababababab","abab")
end
Line 621:
i = instr(s$,find$,i) + length(find$)
end while
end function</
{{out}}
<pre>Igual que la entrada de Run BASIC.</pre>
Line 627:
==={{header|Yabasic}}===
{{trans|Run BASIC}}
<
print countSubstring("ababababab","abab")
end
Line 639:
end while
return countSubstring
end sub</
{{out}}
<pre>Igual que la entrada de Run BASIC.</pre>
Line 645:
=={{header|Batch File}}==
<
setlocal enabledelayedexpansion
Line 665:
set input=!trimmed!
set /a cnt+=1
goto count_loop</
{{Out}}
<pre>3
Line 671:
=={{header|BBC BASIC}}==
<
sub$ = "th"
PRINT ; FNcountSubstring(tst$, sub$) " """ sub$ """ in """ tst$ """"
Line 687:
UNTIL I% = 0
= N%
</syntaxhighlight>
{{out}}
<pre>3 "th" in "the three truths"
Line 693:
=={{header|BCPL}}==
<
let countsubstr(str, match) = valof
Line 721:
show("ababababab", "abab")
show("cat", "dog")
$)</
{{out}}
<pre>"th" in "the three truths": 3
Line 729:
=={{header|BQN}}==
<code>/𝕨⍷𝕩</code> finds locations of substrings, rest of the function suppresses overlapping substrings.
<
•Show "abab" Find "ababababab"
•Show "th" Find "the three truths"</
<syntaxhighlight lang="text">2
3</
Using strings.bqn from bqn-libs, another solution is <code>Find←+´Locate</code>, since <code>Locate</code> performs a non-overlapping search.
=={{header|Bracmat}}==
<
= n S s p
. 0:?n:?p
Line 754:
& out$(count-substring$("the three truths".th))
& out$(count-substring$(ababababab.abab))
& ;</
{{out}}
<pre>3
Line 760:
=={{header|C}}==
<
#include <string.h>
Line 781:
printf("not: %d\n", match("abababababa", "aba", 0));
return 0;
}</
Alternate version:
<
#include <string.h>
Line 805:
return 0;
}</
{{out}}
<pre>
Line 814:
=={{header|C sharp|C#}}==
<
class SubStringTestClass
Line 839:
return count;
}
}</
Using C# 6.0's expression-bodied member, null-conditional operator, and coalesce operator features:
<
class SubStringTestClass
{
public static int CountSubStrings(this string testString, string testSubstring) =>
testString?.Split(new [] { testSubstring }, StringSplitOptions.None)?.Length - 1 ?? 0;
}</
=={{header|C++}}==
<
#include <string>
Line 874:
return 0;
}</
{{out}}
<pre>
Line 884:
=={{header|Clojure}}==
Use a sequence of regexp matches to count occurrences.
<
(defn re-quote
"Produces a string that can be used to create a Pattern
Line 895:
(defn count-substring [txt sub]
(count (re-seq (re-pattern (re-quote sub)) txt)))
</syntaxhighlight>
Use the trick of blank replacement and maths to count occurrences.
<
(defn count-substring1 [txt sub]
(/ (- (count txt) (count (.replaceAll txt sub "")))
(count sub)))
</syntaxhighlight>
A Java 8 stream-based solution, which should avoid creation of temporary strings
(though it will produce temporary MatchResult instances).
<
(defn count-substring2 [txt sub]
(-> sub
Line 914:
(.results)
(.count)))
</syntaxhighlight>
=={{header|COBOL}}==
<code>INSPECT</code> can be used for this task without having to create a function.
<
PROGRAM-ID. testing.
Line 939:
GOBACK
.</
{{out}}
Line 949:
=={{header|CoffeeScript}}==
<
countSubstring = (str, substr) ->
n = 0
Line 960:
console.log countSubstring "the three truths", "th"
console.log countSubstring "ababababab", "abab"
</syntaxhighlight>
=={{header|Common Lisp}}==
<
(loop with z = 0 with s = 0 while s do
(when (setf s (search pat str :start2 s))
Line 970:
(count-sub "ababa" "ab") ; 2
(count-sub "ababa" "aba") ; 1</
=={{header|Cowgol}}==
<
sub countSubstring(str: [uint8], match: [uint8]): (count: uint8) is
Line 999:
print_nl();
print_i8(countSubstring("cat","dog")); # should print 0
print_nl();</
{{out}}
Line 1,008:
=={{header|D}}==
<
import std.stdio, std.algorithm;
"the three truths".count("th").writeln;
"ababababab".count("abab").writeln;
}</
{{out}}
<pre>3
Line 1,019:
=={{header|Delphi}}==
<
{$APPTYPE CONSOLE}
Line 1,041:
Writeln(CountSubstring('the three truths', 'th'));
Writeln(CountSubstring('ababababab', 'abab'));
end.</
=={{header|Dyalect}}==
<
var idx = 0
var count = 0
Line 1,060:
print(countSubstring("the three truths", "th"))
print(countSubstring("ababababab", "abab"))</
{{out}}
Line 1,068:
=={{header|Déjà Vu}}==
<
!. count "ababababab" "abab"</
{{out}}
<pre>3
Line 1,075:
=={{header|EchoLisp}}==
<
;; from Racket
(define count-substring
Line 1,084:
(count-substring "/ .e/" "Longtemps je me suis couché de bonne heure") ;; regexp
→ 4
</syntaxhighlight>
=={{header|EGL}}==
{{works with|EDT}}
The "remove and count the difference" and "manual loop" methods. Implementation includes protection from empty source and search strings.
<
function main()
Line 1,140:
end
</syntaxhighlight>
{{out}}
<pre>Remove and Count:
Line 1,162:
=={{header|Eiffel}}==
<
class
APPLICATION
Line 1,198:
search_for:STRING = "abab"
end
</syntaxhighlight>
=={{header|Elixir}}==
<
(str, sub) -> length(String.split(str, sub)) - 1 end
Line 1,215:
Enum.each(data, fn{str, sub} ->
IO.puts countSubstring.(str, sub)
end)</
{{out}}
Line 1,230:
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">
%% Count non-overlapping substrings in Erlang for the rosetta code wiki.
%% Implemented by J.W. Luiten
Line 1,258:
main(String, Sub) ->
match(String, Sub, Sub, 0).</
Command: <
{{out}}
<pre>
Line 1,266:
Alternative using built in functions:
<syntaxhighlight lang="erlang">
main( String, Sub ) -> erlang:length( binary:split(binary:list_to_bin(String), binary:list_to_bin(Sub), [global]) ) - 1.
</syntaxhighlight>
=={{header|Euphoria}}==
<
integer from,count
count = 0
Line 1,287:
? countSubstring("the three truths","th")
? countSubstring("ababababab","abab")</
{{out}}
Line 1,296:
=={{header|F_Sharp|F#}}==
"Remove and count the difference" method, as shown by J, Java, ...
<
let countSubstring (where :string) (what : string) =
Line 1,311:
show "ababababab" "abab"
show "abc" ""
0</
<pre>countSubstring("the three truths", "th") = 3
countSubstring("ababababab", "abab") = 2
Line 1,317:
=={{header|Factor}}==
<
: occurences ( seq subseq -- n ) split-subseq length 1 - ;</
=={{header|Forth}}==
<
2swap 0 >r
begin 2over search
Line 1,329:
s" the three truths" s" th" str-count . \ 3
s" ababababab" s" abab" str-count . \ 2</
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<
implicit none
integer :: n
Line 1,360:
end do
end function
end program</
{{out}}
<pre>3
Line 1,367:
=={{header|FreeBASIC}}==
<
Function countSubstring(s As String, search As String) As Integer
Line 1,386:
Print
Print "Press any key to quit"
Sleep</
{{out}}
Line 1,396:
=={{header|FunL}}==
<
def countSubstring( str, substr ) = Regex( substr ).findAllMatchIn( str ).length()
println( countSubstring("the three truths", "th") )
println( countSubstring("ababababab", "abab") )</
{{out}}
Line 1,420:
=={{header|Go}}==
Using strings.Count() method:
<
import (
"fmt"
Line 1,429:
fmt.Println(strings.Count("the three truths", "th")) // says: 3
fmt.Println(strings.Count("ababababab", "abab")) // says: 2
}</
=={{header|Groovy}}==
Solution, uses the Groovy "find" operator (=~), and the Groovy-extended Matcher property "count":
<
println (('ababababab' =~ /abab/).count)
println (('abaabba*bbaba*bbab' =~ /a*b/).count)
println (('abaabba*bbaba*bbab' =~ /a\*b/).count)</
{{out}}
Line 1,446:
=={{header|Haskell}}==
=== Text-based solution ===
<
-- Return the number of non-overlapping occurrences of sub in str.
Line 1,454:
print $ countSubStrs "the three truths" "th"
print $ countSubStrs "ababababab" "abab"
</syntaxhighlight>
{{out}}
<pre>
Line 1,462:
Alternatively, in a language built around currying, it might make more sense to reverse the suggested order of arguments.
<
import Data.Text hiding (length)
Line 1,481:
"abelian absurdity",
"babel kebab"
]</
{{Out}}
<pre>[5,2,2]</pre>
Line 1,488:
Even though list-based strings are not "the right" way of representing texts, the problem of counting subsequences in a list is generally useful.
<
count [] = error "empty substring"
count sub = go
Line 1,496:
scan [] xs = 1 + go xs
scan (x:xs) (y:ys) | x == y = scan xs ys
| otherwise = go ys</
{{Out}}
<pre>λ> count "th" "the three truths"
Line 1,510:
The following solution is almost two times faster than the previous one.
<
import Data.Maybe (catMaybes)
count :: Eq a => [a] -> [a] -> Int
count sub = length . catMaybes . map (stripPrefix sub) . tails</
=={{header|Icon}} and {{header|Unicon}}==
<
every A := ![ ["the three truths","th"], ["ababababab","abab"] ] do
write("The string ",image(A[2])," occurs as a non-overlapping substring ",
Line 1,530:
}
return c
end</
{{out}}
Line 1,538:
=={{header|J}}==
<
countss=: #@] %~ #@[ - [ #@rplc '';~]</
In other words: find length of original string, replace the string to be counted with the empty string, find the difference in lengths and divide by the length of the string to be counted.
Line 1,545:
Example use:
<
3
'ababababab' countss 'abab'
2</
=={{header|Java}}==
{{works with|Java|1.5+}}
The "remove and count the difference" method:
<
public static int countSubstring(String subStr, String str){
return (str.length() - str.replace(subStr, "").length()) / subStr.length();
Line 1,563:
System.out.println(countSubstring("a*b", "abaabba*bbaba*bbab"));
}
}</
{{out}}
<pre>3
Line 1,571:
{{works with|Java|1.5+}}
The "split and count" method:
<
public class CountSubstring {
Line 1,585:
System.out.println(countSubstring("a*b", "abaabba*bbaba*bbab"));
}
}</
{{out}}
<pre>3
Line 1,592:
Manual looping
<
public static int countSubstring(String subStr, String str){
int count = 0;
Line 1,606:
System.out.println(countSubstring("a*b", "abaabba*bbaba*bbab"));
}
}</
{{out}}
<pre>3
Line 1,614:
=={{header|JavaScript}}==
Using regexes:
<
var matches = str.match(new RegExp(subStr, "g"));
return matches ? matches.length : 0;
}</
Using 'split' and ES6 notation:
<
</syntaxhighlight>
=={{header|jq}}==
Using regexes (available in jq versions after June 19, 2014):
<syntaxhighlight lang="jq">
def countSubstring(sub):
[match(sub; "g")] | length;</
"the three truths" | countSubstring("th")</
=={{header|Julia}}==
Line 1,639:
'''Main'''
<syntaxhighlight lang="julia">
ts = ["the three truths", "ababababab"]
tsub = ["th", "abab"]
Line 1,654:
println(length(matchall(Regex(tsub[i]), ts[i], true)))
end
</syntaxhighlight>
{{out}}
Line 1,669:
=={{header|K}}==
The dyadic verb _ss gives the positions of substring y in string x.
<
0 4 13
Line 1,680:
#"ababababab" _ss "abab"
2
</syntaxhighlight>
=={{header|Klingphix}}==
<
:count %s !s
Line 1,695:
"ababababab" "abab" count ?
" " input</
Other solution
<
:count "- " convert "-" 2 tolist split len nip ;
Line 1,704:
"ababababab" "abab" count ?
" " input</
{{out}}
<pre>3
Line 1,710:
=={{header|Kotlin}}==
<
fun countSubstring(s: String, sub: String): Int = s.split(sub).size - 1
Line 1,718:
println(countSubstring("ababababab","abab"))
println(countSubstring("",""))
}</
{{out}}
Line 1,728:
=={{header|Lambdatalk}}==
<
{def countSubstring
{def countSubstring.r
Line 1,752:
{countSubstring aba ababa}
-> 1
</syntaxhighlight>
=={{header|langur}}==
<
writeln len indices q(abab), q(ababababab)</
{{out}}
Line 1,763:
=={{header|Lasso}}==
<
local(i = 1, foundpos = -1, found = 0)
while(#i < #str->size && #foundpos != 0) => {
Line 1,788:
//3
countSubstring_bothways('ababababab','abab')
//2</
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">
print countSubstring( "the three truths", "th")
print countSubstring( "ababababab", "abab")
Line 1,805:
countSubstring =c
end function
</syntaxhighlight>
=={{header|Logtalk}}==
Using atoms for string representation:
<
:- object(counting).
Line 1,827:
:- end_object.
</syntaxhighlight>
{{out}}
<
| ?- counting::count('the three truths', th, N).
N = 3
Line 1,837:
N = 2
yes
</syntaxhighlight>
=={{header|Lua}}==
Solution 1:
<
return select(2, s1:gsub(s2, ""))
end
print(countSubstring("the three truths", "th"))
print(countSubstring("ababababab", "abab"))</
<pre>3
2</pre>
Line 1,854:
Solution 2:
<
local count = 0
for eachMatch in s1:gmatch(s2) do
Line 1,863:
print(countSubstring("the three truths", "th"))
print(countSubstring("ababababab", "abab"))</
<pre>3
2</pre>
=={{header|Maple}}==
<syntaxhighlight lang="maple">
f:=proc(s::string,c::string,count::nonnegint) local n;
n:=StringTools:-Search(c,s);
Line 1,878:
f("ababababab","abab",0);
</syntaxhighlight>
{{out}}
<pre>
Line 1,887:
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<
3
StringPosition["ababababab","abab",Overlaps->False]//Length
2</
=={{header|MATLAB}} / {{header|Octave}}==
<
length(findstr("ababababab","abab",0))
length(findstr("the three truths","th",0))
% Count occurrences of a substring with overlap
length(findstr("ababababab","abab",1)) </
{{out}}
Line 1,914:
=={{header|Maxima}}==
<
[n: 0, k: 1],
while integerp(k: ssearch(e, s, k)) do (n: n + 1, k: k + 1),
Line 1,921:
scount("na", "banana");
2</
=={{header|MiniScript}}==
<
return self.split(s).len - 1
end function
print "the three truths".count("th")
print "ababababab".count("abab")</
{{out}}
<pre>
Line 1,937:
=={{header|Mirah}}==
<
import java.util.regex.Matcher
Line 1,975:
puts count_substring3("abab", "ababababab") # ==> 2
puts count_substring3("a*b", "abaabba*bbaba*bbab") # ==> 2
</syntaxhighlight>
=={{header|Nanoquery}}==
{{trans|Java}}
<
return int((len(str) - len(str.replace(subStr, ""))) / len(subStr))
end</
=={{header|Nemerle}}==
{{trans|F#}}
<
module CountSubStrings
Line 2,007:
WriteLine($"$target2 occurs $(text2.CountSubStrings(target2)) times in $text2");
}
}</
{{out}}
<pre>th occurs 3 times in the three truths
Line 2,015:
NetRexx provides the <tt>''string''.countstr(''needle'')</tt> built-in function:
<
options replace format comments java crossref symbols nobinary
Line 2,037:
return
</syntaxhighlight>
{{out}}
<pre>
Line 2,046:
=={{header|NewLISP}}==
<
; url: http://rosettacode.org/wiki/Count_occurrences_of_a_substring
; author: oofoe 2012-01-29
Line 2,088:
)
(exit)</
{{out}}
Line 2,101:
=={{header|Nim}}==
<
proc count(s, sub: string): int =
Line 2,114:
echo count("the three truths","th")
echo count("ababababab","abab")</
{{out}}
<pre>3
Line 2,121:
=={{header|Objective-C}}==
The "split and count" method:
<
- (NSUInteger)occurrencesOfSubstring:(NSString *)subStr;
@end
Line 2,140:
}
return 0;
}</
{{out}}
<pre>3
Line 2,148:
The "remove and count the difference" method:
<
- (NSUInteger)occurrencesOfSubstring:(NSString *)subStr;
@end
Line 2,167:
}
return 0;
}</
{{out}}
<pre>3
Line 2,175:
Manual looping:
<
- (NSUInteger)occurrencesOfSubstring:(NSString *)subStr;
@end
Line 2,200:
}
return 0;
}</
{{out}}
<pre>3
Line 2,208:
=={{header|OCaml}}==
<
let sub_len = String.length sub in
let len_diff = (String.length str) - sub_len
Line 2,224:
Printf.printf "count 1: %d\n" (count_substring "the three truth" "th");
Printf.printf "count 2: %d\n" (count_substring "ababababab" "abab");
;;</
=={{header|Oforth}}==
<syntaxhighlight lang="oforth">
: countSubString(s, sub)
0 1 while(sub swap s indexOfAllFrom dup notNull) [ sub size + 1 under+ ]
drop ;</
{{out}}
Line 2,242:
=={{header|ooRexx}}==
<syntaxhighlight lang="oorexx">
bag="the three truths"
x="th"
Line 2,255:
x="abab"
say left(bag,30) left(x,15) 'found' bag~caselesscountstr(x)
</syntaxhighlight>
{{out}}
<pre style="height:10ex;overflow:scroll">
Line 2,264:
=={{header|PARI/GP}}==
<
my(i=1,s);
while(i+#u<=#v,
Line 2,277:
substr(s1,s2)=subvec(Vec(s1),Vec(s2));
substr("the three truths","th")
substr("ababababab","abab")</
{{out}}
<pre>%1 = 3
Line 2,286:
=={{header|Perl}}==
<
my $str = shift;
my $sub = quotemeta(shift);
Line 2,295:
print countSubstring("the three truths","th"), "\n"; # prints "3"
print countSubstring("ababababab","abab"), "\n"; # prints "2"</
=={{header|Phix}}==
<!--<
<span style="color: #004080;">sequence</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #008000;">"the three truths"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"th"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"ababababab"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"abab"</span><span style="color: #0000FF;">},</span>
Line 2,319:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The string \"%s\" occurs as a non-overlapping substring %d times in \"%s\"\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">substring</span><span style="color: #0000FF;">,</span><span style="color: #000000;">count</span><span style="color: #0000FF;">,</span><span style="color: #000000;">test</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</
{{out}}
<pre>
Line 2,331:
=={{header|PHP}}==
<
echo substr_count("the three truths", "th"), PHP_EOL; // prints "3"
echo substr_count("ababababab", "abab"), PHP_EOL; // prints "2"
</syntaxhighlight>
=={{header|Picat}}==
Line 2,342:
===Recursion===
<
count_rec(S,SB,0,C).
Line 2,351:
count_rec([T|Rest],SB,Count0,Count) :-
T != SB, % this character is not a substring
count_rec(Rest,SB,Count0,Count).</
===Iterative===
Iterative version using find/4 (wrap with once/1 to avoid backtracking).
{{trans|Euphoria}}
<
SLen = S.len,
Count = 0,
Line 2,369:
)
end,
C = Count.</
The time differences between these two versions are quite large which is shown in a benchmark of searching the substring "ab" in a string of 100 000 random characters from the set of "abcde":
Line 2,377:
=={{header|PicoLisp}}==
<
(let (Cnt 0 H (chop Sub))
(for (S (chop Str) S (cdr S))
Line 2,383:
(inc 'Cnt)
(setq S (map prog2 H S)) ) )
Cnt ) )</
Test:
<pre>: (countSubstring "the three truths" "th")
Line 2,392:
=={{header|Pike}}==
<syntaxhighlight lang="pike">
write("%d %d\n",
String.count("the three truths", "th"),
String.count("ababababab", "abab"));
</syntaxhighlight>
{{Out}}
<pre>
Line 2,403:
=={{header|PL/I}}==
<
declare (i, tally) fixed binary;
declare (text, key) character (100) varying;
Line 2,416:
end;
put skip list (tally);
end cnt;</
Output for the two specified strings is as expected.
Line 2,427:
=={{header|PL/M}}==
<
/* CP/M CALLS */
BDOS: PROCEDURE (FN, ARG); DECLARE FN BYTE, ARG ADDRESS; GO TO 5; END BDOS;
Line 2,475:
CALL EXIT;
EOF</
{{out}}
<pre>3
Line 2,491:
Note that while this example is marked as working with PB/Win, the <code>PRINT</code> statement would need to be replaced with <code>MSGBOX</code>, or output to a file. (PB/Win does not support console output.)
<
PRINT "the three truths, th:", TALLY("the three truths", "th")
PRINT "ababababab, abab:", TALLY("ababababab", "abab")
END FUNCTION</
{{out}}
Line 2,503:
{{works with|PowerShell|4.0}}
<syntaxhighlight lang="powershell">
[regex]::Matches("the three truths", "th").count
</syntaxhighlight>
<b>Output:</b>
<pre>
Line 2,511:
</pre>
<syntaxhighlight lang="powershell">
[regex]::Matches("ababababab","abab").count
</syntaxhighlight>
<b>Output:</b>
<pre>
Line 2,525:
Using SWI-Prolog's string facilities (this solution is very similar to the Logtalk solution that uses sub_atom/5):
<
count_substring(String, Sub, Total) :-
Line 2,543:
DropN is Before + Length,
sub_string(String, DropN, Remain, 0, Rest).
</syntaxhighlight>
Usage:
<
?- count_substring("the three truths","th",X).
X = 3.
Line 2,552:
?- count_substring("ababababab","abab",X).
X = 2.
</syntaxhighlight>
=== version using DCG ===
{{works with|SWI-Prolog|7.6.4}}
<
:- system:set_prolog_flag(double_quotes,chars) .
Line 2,591:
.
</syntaxhighlight>
{{out}}
Line 2,614:
=={{header|PureBasic}}==
<
b = CountString("ababababab","abab")
; a = 3
; b = 2</
=={{header|Python}}==
<
3
>>> "ababababab".count("abab")
2</
=={{header|Quackery}}==
Line 2,629:
Quackery does not come equipped with a "find substring m within string n" function, but one is defined in The Book of Quackery, as a demonstration of creating a finite state machine in Quackery. It is reproduced here with permission.
<
[ i^ space +
join ] ] constant is alphabet ( --> $ )
Line 2,683:
else
[ swap buildfsm
usefsm ] ] is find$ ( $ $ --> n )</
<code>find$</code> builds a finite state machine to search for m, (an O(m³) operation), then uses it to search in n with O(n). Rather than use <code>find$</code>, and repeatedly build the same fsm, we will define a word <code>findall$</code> which returns a nest (i.e. list) of positions of m within n. (It actually returns the positions of the end of the substring, relative to (for the first instance) the start of the string, or (for subsequent instances) the end of the previous instance of the substring.)
<
[ 2drop [] ] done
[] unrot
Line 2,700:
nip swap again ]
2drop drop ] is findall$ ( $ $ --> [ )
</syntaxhighlight>
{{out}}
Line 2,719:
Finally we can use <code>findall$</code> to fulfil the task requirements.
<
$ "the three truths" $ "th" occurences echo cr
$ "ababababab" $ "abab" occurences echo cr
</syntaxhighlight>
{{out}}
Line 2,735:
The <code>fixed</code> parameter (and, in <code>stringr</code>, the function of the same name) is used to specify a search for a fixed string. Otherwise, the search pattern is interpreted as a POSIX regular expression. PCRE is also an option: use the <code>perl</code> parameter or function.
<
{v = attr(gregexpr(needle, haystack, fixed = T)[[1]], "match.length")
if (identical(v, -1L)) 0 else length(v)}
print(count("hello", "l"))</
{{libheader|stringr}}
<
print(str_count("hello", fixed("l")))</
=={{header|Racket}}==
<
(define count-substring
(compose length regexp-match*))
</syntaxhighlight>
<
> (count-substring "th" "the three truths")
3
> (count-substring "abab" "ababababab")
2
</syntaxhighlight>
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku"
say count-substring("the three truths", "th"); # 3
say count-substring("ababababab", "abab"); # 2
say count-substring(123123123, 12); # 3</
The <tt>:r</tt> adverb makes the regex "ratchet forward" and skip any overlapping matches. <tt>.comb</tt> - when given a <tt>Regex</tt> as an argument - returns instances of that substring. Also, prefix <tt>+</tt> forces numeric context in Raku (it's a no-op in Perl 5). For the built in listy types that is the same as calling <tt>.elems</tt> method. One other style point: we now tend to prefer hyphenated names over camelCase.
=={{header|Red}}==
<
count-occurrences: function [string substring] [
Line 2,780:
print [test-case-1 "-" count-occurrences test-case-1 "th"]
print [test-case-2 "-" count-occurrences test-case-2 "abab"]
</syntaxhighlight>
{{out}}
<pre>the three truths - 3
Line 2,802:
::::* too many arguments
::::* if '''start''' is a positive integer (when specified)
<
w=. /*max. width so far.*/
bag= 'the three truths' ; x= "th" ; call showResult
Line 2,830:
if x=='' then x= " (null)" /* " " " " */
say left(bag, w) left(x, w%2) center(countstr(bag, x), 5)
return</
'''output''' when using the default (internal) inputs:
<pre>
Line 2,847:
=={{header|Ring}}==
<syntaxhighlight lang="ring">
aString = "Ring Welcome Ring to the Ring Ring Programming Ring Language Ring"
bString = "Ring"
Line 2,858:
cString = substr(cString,substr(cString,dString)+len(string(sum)))
end
return sum</
Output:
Line 2,866:
=={{header|Ruby}}==
<
str.scan(subStr).length
end
p countSubstrings "the three truths", "th" #=> 3
p countSubstrings "ababababab", "abab" #=> 2</
String#scan returns an array of substrings, and Array#length (or Array#size) counts them.
=={{header|Run BASIC}}==
<
print countSubstring("ababababab","abab")
Line 2,884:
i = instr(s$,find$,i) + len(find$)
WEND
END FUNCTION</
{{out}}
<pre>3
Line 2,890:
=={{header|Rust}}==
<
fn main() {
println!("{}","the three truths".matches("th").count());
println!("{}","ababababab".matches("abab").count());
}
</syntaxhighlight>
{{out}}
<pre>
Line 2,904:
=={{header|Scala}}==
===Using Recursion===
<
def countSubstring(str1:String, str2:String):Int={
@tailrec def count(pos:Int, c:Int):Int={
Line 2,911:
}
count(0,0)
}</
===Using Sliding===
<
str.sliding(sub.length).count(_ == sub)</
===Using Regular Expressions===
<
<br/>
<
println(countSubstring("the three truths", "th"))</
{{out}}
<pre>2
Line 2,928:
=={{header|Scheme}}==
{{works with|Gauche Scheme}}
<
#<undef>
gosh> (length (lrxmatch "th" "the three truths"))
Line 2,934:
gosh> (length (lrxmatch "abab" "ababababab"))
2
</syntaxhighlight>
=={{header|Seed7}}==
<
const func integer: countSubstring (in string: stri, in string: searched) is func
Line 2,956:
writeln(countSubstring("the three truths", "th"));
writeln(countSubstring("ababababab", "abab"));
end func;</
{{out}}
Line 2,966:
=={{header|SenseTalk}}==
'''Simply stated:'''
<
put the number of occurrences of "th" in "the three truths" --> 3
put the number of occurrences of "abab" in "ababababab" -- > 2
</syntaxhighlight>
'''User-created function:'''
<
put countSubstring("aaaaa","a") // 5
put countSubstring("abababa","aba") // 2
Line 2,978:
return number of occurrences of subString in mainString
end countSubstring
</syntaxhighlight>
=={{header|Sidef}}==
'''Built-in:'''
<
say "ababababab".count("abab");</
'''User-created function:'''
<
var re = Regex.new(ss.escape, 'g'); # 'g' for global
var counter = 0;
Line 2,994:
say countSubstring("the three truths","th");
say countSubstring("ababababab","abab");</
{{out}}
<pre>
Line 3,001:
</pre>
=={{header|Simula}}==
<
INTEGER PROCEDURE COUNTSUBSTRING(T,TSUB); TEXT T,TSUB;
Line 3,020:
OUTINT(COUNTSUBSTRING("ABABABABAB", "ABAB"),0);
OUTIMAGE;
END.</
{{out}}
<pre>
Line 3,029:
=={{header|Smalltalk}}==
{{works with|Smalltalk/X}}
<
Transcript showCR:('ababababab' occurrencesOfString:'abab')</
{{out}}
<pre>3
Line 3,036:
=={{header|SNOBOL4}}==
<syntaxhighlight lang="snobol4">
DEFINE("countSubstring(t,s)")
Line 3,048:
3
2
</syntaxhighlight>
=={{header|Standard ML}}==
<
let
fun aux (str', count) =
Line 3,069:
print (Int.toString (count_substrings ("the three truths", "th")) ^ "\n");
print (Int.toString (count_substrings ("ababababab", "abab")) ^ "\n");
print (Int.toString (count_substrings ("abaabba*bbaba*bbab", "a*b")) ^ "\n");</
=={{header|Stata}}==
<
n = 0
k = 1-(i=strlen(x))
Line 3,085:
strcount("ababababab","abab")
2</
=={{header|Swift}}==
<
func countSubstring(str: String, substring: String) -> Int {
Line 3,096:
print(countSubstring(str: "the three truths", substring: "th"))
print(countSubstring(str: "ababababab", substring: "abab"))</
{{out}}
Line 3,105:
=={{header|Tcl}}==
The regular expression engine is ideal for this task, especially as the <tt>***=</tt> prefix makes it interpret the rest of the argument as a literal string to match:
<
regexp -all ***=$needle $haystack
}
puts [countSubstrings "the three truths" "th"]
puts [countSubstrings "ababababab" "abab"]
puts [countSubstrings "abaabba*bbaba*bbab" "a*b"]</
{{out}}
<pre>3
Line 3,117:
=={{header|Transd}}==
<
MainModule: {
Line 3,130:
(countSubstring "ababababab" "abab")
)
}</
<pre>
3
Line 3,137:
=={{header|TUSCRIPT}}==
<
$$ MODE TUSCRIPT, {}
occurences=COUNT ("the three truths", ":th:")
occurences=COUNT ("ababababab", ":abab:")
occurences=COUNT ("abaabba*bbaba*bbab",":a\*b:")
</syntaxhighlight>
{{out}}
<pre>
Line 3,152:
=={{header|TXR}}==
<
@(do (defun count-occurrences (haystack needle)
(for* ((occurrences 0)
Line 3,165:
@(output)
@(count-occurrences hay ndl) occurrences(s) of @ndl inside @hay
@(end)</
<pre>$ ./txr count-occurrences.txr "baba" "babababa"
Line 3,174:
=={{header|UNIX Shell}}==
{{works with|Bash}}
<
function countString(){
Line 3,188:
countString "the three truths" "th"
countString "ababababab" "abab"</
{{Out}}
<pre>3
Line 3,195:
=={{header|VBA}}==
<
CountStringInString = UBound(Split(stLookIn, stLookFor))
End Function</
=={{header|VBScript}}==
'''user created function'''
<syntaxhighlight lang="vb">
Function CountSubstring(str,substr)
CountSubstring = 0
Line 3,218:
WScript.StdOut.Write CountSubstring("the three truths","th") & vbCrLf
WScript.StdOut.Write CountSubstring("ababababab","abab") & vbCrLf
</syntaxhighlight>
'''Using built-in Regexp'''
Run it with CScript.
<syntaxhighlight lang="vb">
function CountSubstring(str,substr)
with new regexp
Line 3,233:
WScript.StdOut.Writeline CountSubstring("the three truths","th")
WScript.StdOut.Writeline CountSubstring("ababababab","abab")
</syntaxhighlight>
{{Out}}
<pre>
Line 3,241:
=={{header|Visual Basic .NET}}==
<
Sub Main()
Console.WriteLine(CountSubstring("the three truths", "th"))
Line 3,260:
Return count
End Function
End Module</
{{Out}}
<pre>3
Line 3,268:
=={{header|Vlang}}==
<
println('the three truths'.count('th'))
println('ababababab'.count('abab'))
}</
{{out}}
Line 3,280:
=={{header|Wortel}}==
<
c &[s t] #!s.match &(t)g
Line 3,287:
!!c "ababababab" "abab"
]]
}</
Returns: <pre>[3 2]</pre>
Line 3,293:
{{libheader|Wren-pattern}}
{{libheader|Wren-fmt}}
<
import "/fmt" for Fmt
Line 3,312:
var count = countSubstring.call(test[0], test[1])
Fmt.print("$6s occurs $d times in $q.", Fmt.q(test[1]), count, test[0])
}</
{{out}}
Line 3,324:
=={{header|XPL0}}==
<
string 0; \use zero-terminated strings, instead of MSb terminated
Line 3,364:
[IntOut(0, SubStr("the three truths", "th")); CrLf(0);
IntOut(0, SubStr("ababababab", "abab")); CrLf(0);
]</
{{out}}
Line 3,385:
=={{header|zkl}}==
Two solutions:
<
while(Void!=(n:=s.find(p,n))){cnt+=1; n+=pn}
cnt
}</
{{trans|J}}
<
{{out}}
<pre>
Line 3,402:
=={{header|ZX Spectrum Basic}}==
<
20 LET t$="THE THREE TRUTHS": LET p$="TH": GO SUB 1000
30 STOP
Line 3,411:
1040 NEXT i
1050 PRINT p$;"=";c''
1060 RETURN </
|