Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8883[/thread]

RegEx-Frage2: Rekursion: Zeit zum Schlafengehen



<< >> 3 Einträge, 1 Seite
pktm
 2007-03-28 02:41
#75468 #75468
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Eine habe ich noch:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my $s = qq~['S', ['NP', ['XP', ['YP', ['ZP'], ['ZP']]] 'VP']]~;
my $wort = qr/\[\'\w+\'\](?:\,\s)*/;
my $struktur;
$struktur = qr/
   (?:
   \[\'\w+\'\,\s
   ($wort|$struktur)+
   \]
   (?:\,\s)*
   )+
/x;

if( $s =~ $struktur ) {
   print "gefunden!\n";
   print $&;
}else{
   print "nicht gefunden  :-(\n";
}


Da erhalte ich als Ergebnis ['YP', ['ZP'], ['ZP']].
Ich hätte aber auch gerne die Strukturen drumherum, also auch die anderen ['\w+', ...nochmalsowasOderEinWortHier...] - Strukturen. Nicht nur das notwendigste um die Bedingung zu erfüllen sondern alles (gab es da nicht einen Schalter für?).

Wie geht das?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2007-03-28 10:15
#75469 #75469
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Meinst Du das hier:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

use strict;
use warnings;

my $string = qq~['S', ['NP', ['XP', ['YP', ['ZP'], ['ZP']]] 'VP']]~;

our $pat;
$pat = qr!\[(?>(?>[^\[\]]+)|(??{$pat}))*\]!;

if( $string =~ /^($pat)$/ ){
    print "matcht $1!\n";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pktm
 2007-03-28 14:14
#75470 #75470
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja super!

Und schon haben wir eine RegEx für unmittelbare Dominanz in einem Baum:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/perl

use strict;
use warnings;

my $string = qq~['X', ['S', ['Y', ['X0']], ['NP', ['YP', ['ZP']], 'VP'], 'DA']]~;

our $pat;
$pat = qr!
    \[
    (?>
        (?>[^\[\]]+)
        |
        (??{$pat})
    )*
    \](?:\,\s)*
!x;

if( $string =~ /\[\'S\'\,\s($pat)*\[\'NP\'/ ) {
    print "matcht $1!\n";
    print "alles: $&\n";
}else{
    print "nix gefunden  :-(\n";
}
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 3 Einträge, 1 Seite



View all threads created 2007-03-28 02:41.