Most enlighted monks!

I am looking for a neat way to count the frequency of the occurence of a given expression in a string. The answer to this will include regular expressions and there is a bit to this question in the CPAN regular expressions tutorial - it is just too condensed for the mind of this humble novice.

The background to my inquiry is that I am extracting the number and dates of events from a calendar. Using a simple match and extraction only gets me the first time of an event, even if there are several listings in the calendar. E.g. (this is not tested, but you will get the idea),

my @dates; my string='All kinds of text 01-01-2003 Perl Party more text 01-01-200 +4 Perl Party and even more text 01-01-2005 Perl Party and finally s +ome other date 01-01-2006'; if ($string=~/([0-9]{2})-([0-9]{2})-([0-9]{4})\s$/ {my $date="$1\.$2\. +$3"; push @dates, %date}}

will return only one perl party, namely the in 2003. One idea to remedy this, would be to split the string into substrings using the event as a delimiter and run the substrings through a for-loop. E.g.,

my @substrings=split( /Perls\sin\sParty/, $string); for my $substring (@substrings) { if ($substring=~/([0-9]{2})-([0-9]{2})-([0-9]{4})\s$/) { my $date; $date="$1\.$2\.$3"; print "There is a Perl Party on $date\n";}

But this would also return a Perl Party for 2006, which is simply a date which happens to be at the end of the final string. So we would have to test for genuine perl party dates by checking if the next (actually only if the last) substring starts with the expression "Perl Party". Because using the search string as a delimiter deletes the search expression from the substrings, we would have to go back to the original string and test all the dates we found. E.g.,

if ($substring=~/([0-9]{2})-([0-9]{2})-([0-9]{4})\s$/) { my $date="$1\.$2\.$3"; my $testdate="$1\.$2\.$3"." Perl Party"; if ($string=~/$testdate/ { print "There is a Perl Party on $date\n";} }}

As you can see this is getting rather complicated. I bet there is an easier for to at least count the frequency of the occurence of an expression in a string an possibly also for the extraction of a substring preceeding it.

Thank you for your efforts!

Your most humbly novice


In reply to Counting frequency of expressions in a string by New Novice

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.