Schrift
[thread]11691[/thread]

Wieder eine lustige RegEx



<< >> 10 Einträge, 1 Seite
pktm
 2008-04-22 22:09
#108754 #108754
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Liebe alle!

ich würde gerne eine Zeile einer Datei, die wie folgt aufgebaut ist:
Code: (dl )
my $line = "bellt	[VVFIN person=3 number=sg mood=ind tense=pres]";


in ihre Bestandteile zerlegen. Der Part attr=val kann beliebig oft vorkommen, und soll eine Attribut-Wert-Matrix ergeben.

Jetzt könnte ich mir das einfach machen, und getreu meines Wissensstandes zuerst das Wort, POS und den Teil mit den AW-Paaren ausfiltern, und dann die Attribute zerlegen, aber das wäre ja langweilig und vor allem - von anderen lesbar.
Nein, viel lieber würde ich das alles in einer einzigen großen RegEx unterbringen.
Hier mein Ansatz:
Code: (dl )
my ($wort, $pos, %attrs) = $line =~ m/^(\w+)\s+\[(\w+)(?=\s)(?:\s+([^=]+)=([^=]+))*\]$/g;


Aber ich erwische immer nur das letzte Attribut-Wert-Paar. Ich will aber alle.
Weis wer Rat?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
DanielH
 2008-04-22 22:56
#108757 #108757
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Quote
[...] und vor allem - von anderen lesbar.


Und was ist daran so schlimm? ;) Ist doch gut wenn es andere (und vor allem du selbst nach ein paar Wochen) lesen können.
pktm
 2008-04-22 23:03
#108759 #108759
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja, aber ich plane in einem C++-Forum zu fragen, wie man das in C++ machen könnte *fg*
Und da dachte ich, geb ich mal ein kleines Codebeispiel...
http://www.intergastro-service.de (mein erstes CMS :) )
murphy
 2008-04-22 23:35
#108760 #108760
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Warum es so nicht geht, ist ja klar: Das g-Flag ist nutzlos, weil das Muster verankert ist und zurückgegeben wird eine Liste fester Länge mit den letzten Treffern für alle aufgefangenen Gruppen, was für die letzten beiden Gruppen eben der letzte Schlüssel und Wert in der Zeichenkette sind.

Ich denke aber, dass man das Problem nur dann mit einem einzigen regulären Ausdruck erschlagen kann, wenn man eingebetteten Code verwendet. Ich würde eher den Zweizeiler bevorzugen:
Code (perl): (dl )
1
2
my ($word, $pos, $attrs) = $line =~ /^(\w+)\s+\[(\w+)\s+(.*)\]/;
my %attrs = map m/(\w+)=(\w+)/, split /\s+/, $attrs;


edit: In C(++) ließe sich dieses Problem mit Hilfe von strtok auch recht elegant lösen.
When C++ is your hammer, every problem looks like your thumb.
pktm
 2008-04-23 00:05
#108762 #108762
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
ja genau! Ich habs mal grade an einer trivialeren Form ausprobiert:
"aaa" =~ m/^(a)+$/

Schade eigentlich. Vllt. stelle ich stattdessen mal diese kontextsentivive "RegEx" vor, die ich da noch herumliegen habe... ^^
http://www.intergastro-service.de (mein erstes CMS :) )
Dubu
 2008-04-29 03:34
#108965 #108965
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Die korrekte Lösung für ein komplexeres Regex-Problem unter C/C++ sollte wohl lauten "nutze die libpcre". ;-)
Gast Gast
 2008-04-29 06:47
#108966 #108966
Code (perl): (dl )
1
2
my ($word, $pos, $attrs) = $line =~ /^(\w+)\s+\[(\w+)\s+(.*)\]/;
my %attrs = map m/(\w+)=(\w+)/, split /\s+/, $attrs;

geht auch einfacher:
Code (perl): (dl )
1
2
my ($word, $pos, $attrs) = $line =~ /^(\w+)\s+\[(\w+)\s+(.*)\]/;
my %attrs = split /\s+|=/, $attrs;
pktm
 2008-04-29 13:25
#108981 #108981
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Dubu+2008-04-29 01:34:27--
Die korrekte Lösung für ein komplexeres Regex-Problem unter C/C++ sollte wohl lauten "nutze die libpcre". ;-)


Keine Ahnung was das ist. Das war nur so ein Einstiegskurs. Ist es eine externe lib? So wie boost? Dann kann & will & darf ichsie gar nicht verwenden :)
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2008-04-29 13:31
#108983 #108983
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
pktm+2008-04-29 11:25:08--
Dubu+2008-04-29 01:34:27--
Die korrekte Lösung für ein komplexeres Regex-Problem unter C/C++ sollte wohl lauten "nutze die libpcre". ;-)


Keine Ahnung was das ist.


Bibliothek für "Perl Compatible Regular Expressions"
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/
Strat
 2008-05-01 00:50
#109057 #109057
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
pktm+2008-04-22 20:09:02--
Code: (dl )
my $line = "bellt	[VVFIN person=3 number=sg mood=ind tense=pres]";


funktioniert vielleicht folgender:
Code: (dl )
my %data = $line =~ /(\w+)=(\w+)/g;
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 10 Einträge, 1 Seite



View all threads created 2008-04-22 22:09.