[ale] Yet another regex question

Christopher Fowler cfowler at outpostsentinel.com
Sat Aug 13 16:48:36 EDT 2005


It only works when there are 2 spaces in front of the alarm

[cfowler at shuttle ~]$ ./regex.pl '([^%].|\S)XMI001' 'XMI001'
No
[cfowler at shuttle ~]$ ./regex.pl '([^%].|\S)XMI001' '  XMI001'
Yes


Maybe I'm doing it wrong?[cfowler at shuttle ~]$ cat regex.pl 
#!/usr/bin/perl
die "regex.pl <regex> <test string>\n" unless $ARGV[0] and $ARGV[1];
my $regex = $ARGV[0];
if($ARGV[1] =~ m/$regex/) {
        print "Yes\n";
} else {
        print "No\n";
}


The only reason I'm using perl this way is to test the regex.



On Sat, 2005-08-13 at 15:42 -0400, Stephen Cristol wrote:
> On Aug 13, 2005, at 2:25 PM, Stephen Cristol wrote:
> > On Aug 12, 2005, at 9:29 PM, Christopher Fowler wrote:
> >> I guess what I'm asking is if there is a way to catch 'XMI001' instead
> >> of '%\sXMI001' without using the anchors
> >
> > Probably not. The following perl regex will catch most of what you 
> > want:
> >
> >    /[^%]\S$signal/
> 
> Maybe I can get it right on the second try:
> 
>      /([^%].|\S)$signal/
> 
> This also has the minor benefit of eliminating the special case when 
> the signal offset from the beginning of the string is 1.
> 
> S
> 
> > where $signal is "XMI001", the caret is a negation rather than an
> > anchor, and the "\S" (uppercase "S") matches a character that is not
> > whitespace. (NB: if $signal contains regex metacharacters, it will
> > probably need to be enclosed in parentheses.)
> >
> > This misses the signal when it occurs at offset 0 or 1 from the
> > beginning of the string. A potentially easy fix for this (which may not
> > be an option in your environment) is to prepend two spaces to the
> > beginning of every string processed. That guarantees that there will be
> > enough leading characters for the above regex to match the signal
> > wherever it occurs in the string.
> 
> 




More information about the Ale mailing list