Thread RegEx: großes, umfangreiches Problem (18 answers)
Opened by pktm at 2003-08-17 18:54

kabel
 2003-08-19 12:23
#65096 #65096
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
nein, beide falsch :) ich lasse euch aber diesmal nicht zappeln. hehe :p
reguläre ausdrücke sind eine "schwächere" form von grammatiken. wenn du z.b. sagst:

Quote
$stupid_form_input =~ m/^[ab]{1,3}$/ or die ...


dann ist /^[ab]{1,3}$/ die beschreibung einer einfachen sprache - sie enthält genau folgende elemente:
{ "a", "b", "aa", "ab", "ba", "ab", "aaa", "aab", "aba", "ab", "baa", "bab", "bba", "bbb" }
das wird bei sogar bei einfachen regulären ausdrücken schnell recht komplex. der reguläre ausdruck kann in einer grammatik dargestellt werden:

start: a_oder_b a_oder_b? a_oder_b?
a_oder_b: "a" | "b"

(genauso lesen wie oben beschrieben) probiert es doch einfach mal aus. flux das modul Parse::RecDescent installieren und folgendes programm ausführen:

Code: (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
25
26
27
28
29
30
31
32
33
use strict;
use Parse::RecDescent;

my $grammar = '
start: a_oder_b a_oder_b(?) a_oder_b(?) eos
a_oder_b: "a" | "b"
eos: "?"
';
my $parser = Parse::RecDescent->new ($grammar);
my $re = qr/^[ab]{1,3}$/;

my $input = "";
my $switch = "regexp";
my $res = 0;

print "exit beendet, switch schaltet um\n\n";
while ($input ne "exit") {
printf "%-7s: gib irgendwas ein: ", $switch;
chomp ($input = <STDIN>);

if ($input eq "switch") {
$switch eq "regexp" and $switch = "grammar" or $switch = "regexp";
next;
} elsif ($input eq "exit") {
next;
} elsif ($switch eq "regexp") {
$res = "$input" =~ $re ? 1 : 0;
} else {
$res = $parser->start ("$input?") ? 1 : 0;
}

print "[$switch] [$input] wird", $res ? "" : " nicht", " erkannt\n";
}

warum das fragezeichen beim parser-aufruf? aufgrund der arbeitsweise des parsers. damit kennzeichne ich das ende des wortes.

genauso könnte oben beschriebene grammatik als regulärer ausdruck dienen (das überlasse ich dem geneigten leser ;) ), denn das format von pktm enthält keine "rekursive struktur" (oh je, mir wird schlecht...). => für $grammar oben kann genauso eine menge gebaut werden, und diese umfasst u.a. auch die von pktm geposteten beispiele (got it?)

am besten mal ne vorlesung über formale sprachen an der nächsten $uni besuchen :)

SirLant, natürliche sprachen sind die kompliziertesten sprachen überhaupt. die oben beschriebenen sprachen sind von der struktur gesehen sehr einfach. bei natürlichen sprachen gibt es so was wie nebensätze mit all ihren spielarten, numerus und kasus, modus etc. etc. etc.

so jetzt ist aber wirklich schluss. genug unsinn verzapft. :)
-- stefan

View full thread RegEx: großes, umfangreiches Problem