Schrift
[thread]9119[/thread]

RegEx: Wie sind die implementiert?

Leser: 1


<< >> 8 Einträge, 1 Seite
pktm
 2007-06-25 11:25
#77804 #77804
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Wo finde ich Informationen darüber, was bei regulären Ausdrücken in Perl hinter den Kulissen abläuft?
So möchte ich z.B. wissen, ob die als Automat realisiert werden oder als was sonst.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2007-06-25 11:50
#77805 #77805
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Also für die Engine ab Perl 5.9.x gibt es perlreguts, für aktuelle Perl-Versionen gibt es - soweit ich weiß - nichts.
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/
schwabi
 2007-06-25 12:11
#77806 #77806
User since
2006-02-07
18 Artikel
BenutzerIn

user image
a) Mastering Regular Expressions von Jeffrey E. F. Friedl: Kap. 4 The Mechanics of Expression Processing
Das Buch gibt es auch in deutsch.
- Es bietet viel Hintergrundwissen ohne zu "wissenschaftlich" zu sein.
- Es zeigt die Vorgehensweisen der RegEx-Maschinen auf; wie sie in verschiedenen Programmiersprachen/-tools implementiert wurden und welche Vorgehensweise sich daraus für die Bildung der regulären Ausdrücke ergibt.
- Perl hat ein eigenes Kapitel bekommen.

b) Wikipedia: Regulärer Ausdruck
moritz
 2007-06-25 15:02
#77807 #77807
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
c) Hier fragen ;-)
Perl verwendet einen NFA (Non-determnistic finite automaton) mit viel Magie und backtracking

d) Source code lesen ;-)

Wenn du perl mit den entsprechenden Debugging-Optionen kompilierst, kannst du dir auch anzeigen lassen, was alles bei so einem Match passiert - vielleicht ist das auch aufschlussreich für dich.
pktm
 2007-06-25 21:07
#77808 #77808
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Naja, meine Überlegung war, dass wenn die RegEx als endliche Automaten implementiert wären, man doch zwei reguläre Ausdrücke miteinander kombinieren könnte, so mit den bekannten Dingen wie Vereinigung, Schnitt, Verkettung und so. So wäre ich all meine Probleme los, wenn ich verschiedene Teilaufgaben, welche ich bereits einzeln als RegEx vorliegen habe, in eine große RegEx fassen möchte.
http://www.intergastro-service.de (mein erstes CMS :) )
sid burn
 2007-06-25 22:02
#77809 #77809
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=pktm,25.June.2007, 19:07]Naja, meine Überlegung war, dass wenn die RegEx als endliche Automaten implementiert wären, man doch zwei reguläre Ausdrücke miteinander kombinieren könnte, so mit den bekannten Dingen wie Vereinigung, Schnitt, Verkettung und so. So wäre ich all meine Probleme los, wenn ich verschiedene Teilaufgaben, welche ich bereits einzeln als RegEx vorliegen habe, in eine große RegEx fassen möchte.[/quote]
Du kennst den qr// Operator? :D

Code: (dl )
1
2
3
4
my $regex1 = qr/ \[  [^]]+ \] /x;
my $regex2 = qr/abc/i;

my $imba_regex = qr/ $regex1 $regex2 /x;


Die Regex ist einfach so ein Sinnlos Beispiel.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pktm
 2007-06-26 01:37
#77810 #77810
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Des ist aber nur eine einfache Verkettung. Was ist mit sowas wie einem kontextfreien Ausdruck und einer regulären Sprache im Schnittt?

Also z.B. mein Ausdruck für diverse Klammerstrukturen:
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
34
35
=head3 _regex_unmittelbareDominanz( $satz, $dominierendesSymbol, $dominiertesSymbol )

Diese Funktion  überprüft, ob im gegebenen Satz ($satz)
ein Symbol ($dominierendesSymbol) ein anderes Symbol ($dominiertesSymbol)
unmittelbar dominiert.

=cut

sub _regex_unmittelbareDominanz($$$) {
   my ($s, $x1, $x2) = @_;
   
   our $pat;
   $pat = qr!
       (?:
           \[
           (?>
               (?>[^\[\]]+)
               |
               (??{$pat})
           )*
           \](?:\,\s)*
       )
   !x;
   
   say "suche mit $x1, $x2 in $s";
   
   if( $s =~ /\[$x1\,\s?($pat)*\[\[?[\'\,\w\s]*$x2/ ) {
       say "gefunden";
       return 1;
   }else{
       say "nix da!";
       return 0;
   }
   
} # /_regex_unmittelbareDominanz


Und meinen Satz:
Code: (dl )
[['S',[['CNP',[['NP',['NN Leben']],['KON und'],['NP',['NN Tod']]]],['VAFIN waren'],['NP',[['CARD zwei'],['NN Seiten'],['NP',[['PDAT derselben'],['NN Sache']]]]]]]]
http://www.intergastro-service.de (mein erstes CMS :) )
moritz
 2007-06-26 13:49
#77811 #77811
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
In Perl 6 kannst du zwei verschiedene Regexes so kombinieren, dass beide einen (sub)string matchen müssen.

Wenn du
Code: (dl )
1
2
token ident { \w \d+ };
token keyword { f123 };

hast, kannst du die verketten, und- und oderverküpfen:
Code: (dl )
1
2
3
rule verkettet { <ident> <keyword> }
rule oder { <ident> | <keword> }
rule und { <ident> & <keyword> }


Also helft alle mit Perl 6 zu entwickeln, damit bekommen wir sehr viel schönerer regexes ;-)
<< >> 8 Einträge, 1 Seite



View all threads created 2007-06-25 11:25.