Thread Regex bei Zeichenkette über mehrere Zeilen (12 answers)
Opened by Joeyx at 2014-01-09 13:48

Linuxer
 2014-01-09 16:57
#172934 #172934
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Mir fehlen schlicht Informationen, um Dir das sauber zu beantworten.
Und um Dir pauschal einen Lösungsansatz in Code zu erarbeiten, fehlt mir die Zeit.

Kurzer Schnellschuß, ungetestet und auf die Schnelle geraten:
edit: Schnellschuß war fehlerhaft
more (2.8kb):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
# zeilenweise lesen
while ( my $line = <$DATENQUELLE> ) {

  while ( $line =~ m/comment:[^)]*$/ ) {  # solange ein Kommentar beginnt && noch nicht mit ) abgeschlossen wurde,
     chomp $line;                      # entferne Newline
     $line .= <$DATENQUELLE>;          # und lese die nächste Zeile und füge sie hinten an
  }                                    # REMARK: Das geht solange, bis eine ) am Ende von $line auftaucht

  # ... Hier die normale Auswertung dann

}



Hier ein kleines Beispiel, wie ich mir das vorstellte:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#! /usr/bin/perl
use strict;
use warnings;

while ( my $line = <DATA> ) {

        # mehrzeilige Kommentare zusammenfassen
        while ( $line =~ m/:comment/ && $line !~ m/\)$/ ) {
                # lese naechste Zeile aus; Ende, falls EOF erreicht
                defined( my $add = <DATA> ) or last;
                # fuege naechste Zeile hinzu
                $line .= $add;
        }

        # ersetze \n durch " " in mehrzeilige Kommentaren
        $line =~ tr/\n/ /       if $line =~ m/:comment/;

        # NORMALE AUSWERTUNG folgt hier:
        if ( $line =~ m/:comment \((.*)\)/ ) {
                print "Kommentar: $1\n";
        }
}


__DATA__
:data (
  :subdata (
    :whatever ()
    :comment ("kommentar 1")
  )
  :subdata (
    :whatever ()
    :comment ("kommentar 2a
2b")
  )
  :subdata (
    :whatever ()
    :comment ("kommentar 3a
3b
3c")
  )
)


Resultat:
Code: (dl )
1
2
3
Kommentar: "kommentar 1"
Kommentar: "kommentar 2a 2b"
Kommentar: "kommentar 3a 3b 3c"

Last edited: 2014-01-09 22:41:52 +0100 (CET)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Regex bei Zeichenkette über mehrere Zeilen