Count occurrences of a substring: Difference between revisions
→Tcl: Added implementation |
→{{header|Tcl}}: Demonstrate the lack of re-metachar problems |
||
Line 33: | Line 33: | ||
} |
} |
||
puts [countSubstrings "the three truths" "th"] |
puts [countSubstrings "the three truths" "th"] |
||
puts [countSubstrings "ababababab" "abab"] |
puts [countSubstrings "ababababab" "abab"] |
||
puts [countSubstrings "abaabba*bbaba*bbab" "a*b"]</lang> |
|||
Output:<pre>3 |
Output:<pre>3 |
||
2 |
|||
2</pre> |
2</pre> |
Revision as of 10:22, 16 June 2011
You are encouraged to solve this task according to the task description, using any language you may know.
The task is to either create a function, or show a built-in function, to count the number of non-overlapping occurrences of a substring inside a string. The function should take two arguments: the first argument being the string to search and the second a substring to be search for. It should return an integer count.
<lang pseudocode>print countSubstring("the three truths","th") 3
// do not count substrings that overlap with previously-counted substrings: print countSubstring("ababababab","abab") 2</lang>
Perl
This solution uses regex, hence the substring cannot contain regex metacharacters <lang perl>sub countSubstring {
my ($str, $sub) = @_; my $count = () = $str =~ /$sub/g; return $count;
- or return scalar( () = $str =~ /$sub/g );
}
print countSubstring("the three truths","th"), "\n"; print countSubstring("ababababab","abab"), "\n";</lang>
Python
<lang python>>>> "the three truths".count("th") 3 >>> "ababababab".count("abab") 2</lang>
Tcl
The regular expression engine is ideal for matching this, especially as the ***= prefix makes it interpret the rest of the argument as a literal string to match: <lang tcl>proc countSubstrings {haystack needle} {
regexp -all ***=$needle $haystack
} puts [countSubstrings "the three truths" "th"] puts [countSubstrings "ababababab" "abab"] puts [countSubstrings "abaabba*bbaba*bbab" "a*b"]</lang>
Output:
3 2 2