Mailing List Archive

Regex in scrip won't match multi-line strings
Hi all,

I'm trying to automatically resolve tickets that don't require any action.
In this example, I receive a backup notification. I know it's a backup
script result email based on the subject, and I know the backup was
successful (and therefore I can auto-resolve the ticket) if another regex
matches the body. When I match against the subject line alone, it works.
However, when I try to match against the mutli-line body, it never matches
(even though when I run the regex against the string in a test, it matches
as expected).

Are multi-line matches not an option, or do I need to test in another way?
This is an extract of the test I am running:

(($self->TicketObj->Subject =~ /Cron \<root\@blah\> \/usr\/bin\/s3cmd sync
\/var\/spool\/blah\/ s3\:\/\/somes3buckethere\//) &&
($self->TicketObj->Body =~ /Done\. Uploaded \d* bytes in \d\.\d seconds/))

Thank you,

Peter
--
Peter Nikolaidis
CISSP
<https://webportal.isc2.org/custom/CertificationVerificationResults.aspx?FN=Peter&LN=Nikolaidis&CN=453003>
, GCFE <https://www.giac.org/certified-professional/peter-nikolaidis/118082>
, GCIH <https://www.giac.org/certified-professional/peter-nikolaidis/118082>
, GPPA <http://www.giac.org/certified-professional/peter-nikolaidis/118082>
, GSNA <http://www.giac.org/certified-professional/peter-nikolaidis/118082>
Paradigm Consulting Co.
MA:617.517.2940 <(617)%20517-2940> * NH:603.676.7119 <(603)%20676-7119>
* VT:802.234.6368 <(802)%20234-6368>
http://pa.radigm.com
Re: Regex in scrip won't match multi-line strings [ In reply to ]
On Mon, Feb 27, 2017 at 9:48 AM, Peter Nikolaidis <petern@paradigmcc.com> wrote:
> Hi all,
>
> I'm trying to automatically resolve tickets that don't require any action.
> In this example, I receive a backup notification. I know it's a backup
> script result email based on the subject, and I know the backup was
> successful (and therefore I can auto-resolve the ticket) if another regex
> matches the body. When I match against the subject line alone, it works.
> However, when I try to match against the mutli-line body, it never matches
> (even though when I run the regex against the string in a test, it matches
> as expected).
>
> Are multi-line matches not an option, or do I need to test in another way?

From:

http://perldoc.perl.org/perlre.html

"""
Modifier m

Treat the string as multiple lines. That is, change "^" and "$" from
matching the start of the string's first line and the end of its last
line to matching the start and end of each line within the string.
"""
I almost always use /xms for my REs. This allows for significant
readability - at the cost of significant number of lines. Check out
Damian Conway's "Perl Best Practices" Regular Expression chapter.

-m
Re: Regex in scrip won't match multi-line strings [ In reply to ]
Apparently I'm still doing something wrong and regex is kicking my butt.

Sample message body:
-----------------------------------------
* Stopping Asterisk PBX: asterisk
...done.
* Starting Asterisk PBX: asterisk
...done.
-----------------------------------------

Patterns I've tried:
-----------------------------------------
1:
(($self->TicketObj->Subject =~ /Cron \<root\@pbx\> \/etc\/init\.d\/asterisk
restart/) && # Successful cron jobs.
($self->TicketObj->Body =~ /\* Starting Asterisk PBX\:
asterisk\n\.\.\.done\./m)

2:
(($self->TicketObj->Subject =~ /Cron \<root\@pbx\> \/etc\/init\.d\/asterisk
restart/) && # Successful cron jobs.
($self->TicketObj->Body =~ /\* Starting Asterisk PBX\:
asterisk.*\.\.\.done\./ms))
3:
(($self->TicketObj->Subject =~ /Cron \<root\@pbx\> \/etc\/init\.d\/asterisk
restart/) && # Successful cron jobs.
($self->TicketObj->Body =~ /^\* Starting Asterisk PBX\:
asterisk.*\.\.\.done\.$/ms)) ||
-----------------------------------------

Any ideas?

Thanks,

Peter

On Mon, Feb 27, 2017 at 10:57 AM, Matt Zagrabelny <mzagrabe@d.umn.edu>
wrote:

> On Mon, Feb 27, 2017 at 9:48 AM, Peter Nikolaidis <petern@paradigmcc.com>
> wrote:
> > Hi all,
> >
> > I'm trying to automatically resolve tickets that don't require any
> action.
> > In this example, I receive a backup notification. I know it's a backup
> > script result email based on the subject, and I know the backup was
> > successful (and therefore I can auto-resolve the ticket) if another regex
> > matches the body. When I match against the subject line alone, it works.
> > However, when I try to match against the mutli-line body, it never
> matches
> > (even though when I run the regex against the string in a test, it
> matches
> > as expected).
> >
> > Are multi-line matches not an option, or do I need to test in another
> way?
>
> From:
>
> http://perldoc.perl.org/perlre.html
>
> """
> Modifier m
>
> Treat the string as multiple lines. That is, change "^" and "$" from
> matching the start of the string's first line and the end of its last
> line to matching the start and end of each line within the string.
> """
> I almost always use /xms for my REs. This allows for significant
> readability - at the cost of significant number of lines. Check out
> Damian Conway's "Perl Best Practices" Regular Expression chapter.
>
> -m
>
Re: Regex in scrip won't match multi-line strings [ In reply to ]
On Fri, Mar 3, 2017 at 9:30 AM, Peter Nikolaidis <petern@paradigmcc.com> wrote:
> Apparently I'm still doing something wrong and regex is kicking my butt.
>
> Sample message body:
> -----------------------------------------
> * Stopping Asterisk PBX: asterisk
> ...done.
> * Starting Asterisk PBX: asterisk
> ...done.
> -----------------------------------------
>
> Patterns I've tried:
> -----------------------------------------
> 1:
> (($self->TicketObj->Subject =~ /Cron \<root\@pbx\> \/etc\/init\.d\/asterisk
> restart/) && # Successful cron jobs.
> ($self->TicketObj->Body =~ /\* Starting Asterisk PBX\:
> asterisk\n\.\.\.done\./m)
>
> 2:
> (($self->TicketObj->Subject =~ /Cron \<root\@pbx\> \/etc\/init\.d\/asterisk
> restart/) && # Successful cron jobs.
> ($self->TicketObj->Body =~ /\* Starting Asterisk PBX\:
> asterisk.*\.\.\.done\./ms))
> 3:
> (($self->TicketObj->Subject =~ /Cron \<root\@pbx\> \/etc\/init\.d\/asterisk
> restart/) && # Successful cron jobs.
> ($self->TicketObj->Body =~ /^\* Starting Asterisk PBX\:
> asterisk.*\.\.\.done\.$/ms)) ||
> -----------------------------------------
>
> Any ideas?

#!/usr/bin/perl

use strict;
use warnings;

my $sample_message_body = <<EOF;
* Stopping Asterisk PBX: asterisk
...done.
* Starting Asterisk PBX: asterisk
...done.
EOF

my $sample_message_body_2 = <<EOF;
* Stopping Asterisk PBX: asterisk.
...done.
* Starting Asterisk PBX: asterisk.
...done.
EOF

my $re = qr{
^\*\s+Stopping\s+Asterisk\s+PBX:\s+asterisk$
\n
^\.\.\.done\.$
\n
^\*\s+Starting\s+Asterisk\s+PBX:\s+asterisk$
\n
^\.\.\.done\.$
}xms;

if ($sample_message_body =~ $re) {
print "MATCHES!\n";
}
else {
print "NOPE!\n";
}

if ($sample_message_body_2 =~ $re) {
print "MATCHES!\n";
}
else {
print "NOPE!\n";
}

-m
---------
RT 4.4 and RTIR Training Sessions https://bestpractical.com/training
* Paris - April 24-26, 2017