Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

partially matching a regexp

0 views
Skip to first unread message

Thomas Koenig

unread,
Aug 5, 2004, 2:15:19 PM8/5/04
to
Assume I have a regexp, /^(hello)|(goodbye)$/ for example.

I want to see wether a particular string matches part of that
particular regexp, so "", "h", "he", "hel", "hell", "hello", "g",
"go", "goo" "good", "goodb", "goodby" and "goodbye" would be ok,
and anything else wouldn't.

I could hand-craft this example easily enough, but it grows
tedious and error-prone for more general regular expressions,
and automation would be much preferred.

Ideas?

Brian McCauley

unread,
Aug 5, 2004, 2:33:37 PM8/5/04
to

Take a look at the source of File::Stream. A very similar problem is
solved in File::Stream::find and the solution to that problem could
probably be easily be adapted (simplified!) to solve your problem.

Andrew Palmer

unread,
Aug 5, 2004, 10:57:22 PM8/5/04
to

"Thomas Koenig" <Thomas...@online.de> wrote in message
news:cettfn$4o9$1...@meiner.onlinehome.de...

Something like:

if(test($input,"hello") || test($input,"goodbye"))
{
# stuff
}

sub test
{
my($s1,$s2)=@_;
for my $len(0..length($s2))
{
return 1 if(substr($s2,0,$len) eq $s1);
}
return 0;
}

Charles DeRykus

unread,
Aug 6, 2004, 7:48:47 PM8/6/04
to
In article <cettfn$4o9$1...@meiner.onlinehome.de>,

Sounds as if 'index' (perldoc -f index) might be easier and
in some cases faster than a regex:


my $substring = ...
for ( qw/hello goodbye/ ) {
print "$substring matched $_\n" if index($_, $substring) != -1;
}

--
Charles DeRykus

Jay Tilton

unread,
Aug 7, 2004, 11:25:59 PM8/7/04
to
Thomas Koenig <Thomas...@online.de> wrote:

: Assume I have a regexp, /^(hello)|(goodbye)$/ for example.

This sounds like an opportunity to abuse Perl's
(?(condition)pattern) regex feature.

#!/perl
use strict;
use warnings;

my $pat_h = buildpattern( 'hello' );
my $pat_g = buildpattern( 'goodbye' );

while(<DATA> ) {
chomp;
print "matched '$1' in '$_'\n"
if /$pat_h/ or /$pat_g/;
}

sub buildpattern {
my @lets = $_[0] =~ /./g;
my $pat;
for( 0 .. $#lets ) {
$pat .= $_ == 0 ? $lets[$_] :
$_ == 1 ? "($lets[$_])?" :
"((?($_)$lets[$_]))?"
}
return qr/(^$pat)/;
}

__DATA__
hello
helpme
haveaniceday
goodbye
goodgrief
gabbagabbahey

Thomas Koenig

unread,
Aug 9, 2004, 5:04:27 PM8/9/04
to
Brian McCauley <nob...@mail.com> wrote:

>> Assume I have a regexp, /^(hello)|(goodbye)$/ for example.
>>
>> I want to see wether a particular string matches part of that
>> particular regexp,

>Take a look at the source of File::Stream. A very similar problem is

>solved in File::Stream::find and the solution to that problem could
>probably be easily be adapted (simplified!) to solve your problem.

I'm currently doing that, and trying to understand what YAPE::regexp
does (which isn't too easy :-)

If I get anywhere, I'll let the newsgroup know.

Jeff 'japhy' Pinyan

unread,
Aug 9, 2004, 5:22:11 PM8/9/04
to

I'd suggest switching over to Regexp::Parser. I'm hoping to get
Regexp::Explain out in the near future.

--
Jeff "japhy" Pinyan % How can we ever be the sold short or
RPI Acacia Brother #734 % the cheated, we who for every service
RPI Corporation Secretary % have long ago been overpaid?
http://japhy.perlmonk.org/ %
http://www.perlmonks.org/ % -- Meister Eckhart


Andrew Palmer

unread,
Aug 11, 2004, 12:52:50 AM8/11/04
to

"Andrew Palmer" <andrew...@email.com> wrote in message
news:HpCQc.3093$zc1....@fe40.usenetserver.com...

Clearly the above code is retarded. The equivalent using index() is simply:

if(index("hello",$input)==0 || index("goodbye",$input)==0)
{
# stuff
}

The regex tokenizing modules seem unnecessary for the example you posted. Is
your actual test significantly more complicated?


0 new messages