Perl: extrahieren von Daten aus text mit regex
Ich bin mit Perl zu tun Textverarbeitung mit regex. Ich habe keine Kontrolle über die Eingabe. Ich habe gezeigt, einige Beispiele für die Eingabe unten.
Wie Sie sehen können die Elemente B und C können in den string n-mal mit unterschiedlichen Werten. Ich brauchen, um alle Werte als Referenz. Oder wenn Sie wissen, einen anderen Weg bin ich alle Ohren.
Ich bin versucht, branch reset-Muster (wie beschrieben bei perldoc: "Erweiterte Muster") ich bin nicht viel Glück passenden string.
("Daten" ("Int "Ein" 22)(Int "B" 1)(Int " "C" 2) ("Int "D" 34896)(Int "E" 38046)) ("Daten" ("Int "Ein" 22)(Int "B" 1)(Int " "C" 2) ("Int "B" 3)(Int " "C" 4) ("Int "B" 5)(Int " "C" 6) ("Int "D" 34896)(Int "E" 38046)) ("Daten" ("Int "Ein" 22)(Int "B" 22)(Int " "C" 59)(Int "B" 1143)(Int " "C" 1210)(Int "B" 1232)(Int " "C" 34896)(Int "D" 34896)(Int "E" 38046))
Mein Perl ist unten, jede Hilfe wäre toll. Vielen Dank für jede Hilfe, die Sie geben können.
if($inputString =~/\("Data" \(Int "A" ([0-9]+)\)(?:\(Int "B" ([0-9]+)\)\(Int "C" ([0-9]+)\))+\(Int "D" ([0-9]+)\)\(Int "E" ([0-9]+)\)\)/) {
print "\n\nmatched\n";
print "1: $1\n";
print "2: $2\n";
print "3: $3\n";
print "4: $4\n";
print "5: $5\n";
print "6: $6\n";
print "7: $7\n";
print "8: $8\n";
print "9: $9\n";
}
- Es würde sehr helfen, wenn du beschreiben kannst was versuchen Sie zu erreichen. Nicht wie (bekommen alle Werte als Referenz), aber was (also die ich brauche, um das Werten zu können ...)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht versuchen mithilfe einer regex eine Reihe von regexes und splits sind einfacher zu verstehen:
Wenn Ihre Daten erstrecken sich über die Zeilen, ich würde vorschlagen, mit einem parser statt einem regex.
Ich bin nicht sicher, was für ein Vorteil es wäre, um die Werte als back-Referenzen - wer würde Sie wollen, sich mit dem Fall der doppelte Schlüssel (wie "C" in der zweiten Zeile). Auch ich bin mir nicht sicher, was Sie tun möchten, mit den Werten einmal extrahiert.
Aber ich würde anfangen mit sowas wie:
Diese gibt Sie ein array von wiederholt key,value(s).
Mein Erster Gedanke war, die Namen erfasst und die Werte von
%-
:Leider die
(?:...)
Gruppierung wird nicht ausgelöst, die Erfassung mehrerer Werte für B und C. ich vermute, dass das ein bug ist. Tut es explizit erfasst alle Werte, aber du müsstest wissen, die maximale Anzahl der Instanzen vor der Zeit.Der einfachste Ansatz ist die Verwendung von
m//g
. Sie können entweder erfassen Sie name/Wert-Paare, wie Schmaus schlägt, oder verwenden Sie mehrere Muster einzeln zu erfassen-Wert: