Wie kann ich in Perl den übereinstimmenden Teilstring von einem Regex erhalten?

8

Mein Programm liest den Quellcode anderer Programme und spaltet Informationen über verwendete SQL-Abfragen. Ich habe Probleme beim Abrufen von Teilzeichenfolgen.

%Vor%

Im Ergebnis drucke die ganze Zeile und keine Teilstring, die ich erwarte. Ich habe es anders versucht, aber ich benutze Perl selten und mache wahrscheinlich grundlegende Konzeptfehler. (Die Position des Tabellennamens in der Zeile ist nicht festgelegt. Ein anderes Problem ist das mehrfache Auftreten, d.h. [... SELECT * FROM AADTTAB, BBDTTAB, ...]). Wie kann ich diese Teilzeichenfolge erhalten?

    
kato sheen 15.07.2009, 15:13
quelle

6 Antworten

20

Verwenden Sie die Gruppierung mit Klammern und speichern Sie die erste Gruppe.

%Vor%

Der obige Code behebt das unmittelbare Problem, den ersten Tabellennamen herauszuziehen. In der Frage wurde jedoch auch gefragt, wie alle Tabellennamen herausgezogen werden. Also:

%Vor%

Ergebnis:

Wenn $ line="SELECT * FROM AADTTAB, BBDTTAB;"

Ausgabe:

%Vor%

Wenn $ line="SELECT * FROM AADTTAB;"

Ausgabe:

%Vor%

Perl Version: v5.10.0 für MSWin32-x86-Multithread

erstellt     
Jesse Vogt 15.07.2009 15:18
quelle
14

Ich bevorzuge das:

%Vor%

Dies

  1. scannt $line und erfasst den Text, der dem Muster
  2. entspricht
  3. gibt "alle" Captures (1) an die "Liste" auf der anderen Seite zurück.

Dieser Pseudo-Listen-Kontext ist, wie wir das erste Element in einer Liste fangen. Es wird auf die gleiche Weise wie an eine Unterroutine übergebene Parameter ausgeführt.

%Vor%

HINWEIS: : Das heißt, Ihre Regex nimmt zu viel von dem Text an, um in mehr als einer Handvoll Situationen nützlich zu sein. Kein Tabellenname, der nicht dt wie in den Positionen 3 und 4 von 7 hat? Capturing? Es ist gut genug für 1) schnell und schmutzig, 2) wenn Sie mit eingeschränkter Anwendbarkeit einverstanden sind .

    
Axeman 15.07.2009 19:08
quelle
8

Es wäre besser, das Muster anzupassen, wenn es FROM folgt. Ich nehme an, Tabellennamen bestehen ausschließlich aus ASCII-Buchstaben. In diesem Fall ist es am besten zu sagen, was Sie wollen. Beachten Sie, dass eine erfolgreiche erfasste Regex-Übereinstimmung im Listenkontext die übereinstimmende (n) Teilzeichenfolge (n) zurückgibt.

%Vor%

Ausgabe:

%Vor%

Abhängig von der Version von perl auf Ihrem System können Sie möglicherweise eine benannte Erfassungsgruppe verwenden, die das Ganze leichter lesbar macht:

%Vor%

Siehe perldoc perl .

    
Sinan Ünür 15.07.2009 15:18
quelle
7

Mit Parens können Sie einen Teil der Regex in spezielle Variablen aufnehmen: $ 1, $ 2, $ 3 ... Also:

%Vor%     
mleykamp 15.07.2009 15:22
quelle
3

Verwenden Sie eine Erfassungsgruppe:

%Vor%     
friedo 15.07.2009 15:19
quelle
-1

$& enthält die Zeichenfolge, die mit der letzten Musterübereinstimmung übereinstimmt.

Beispiel:

%Vor%

Sie könnten also etwas wie

tun %Vor%

WARNUNG:

Wenn Sie in Ihrem Code $& verwenden, verlangsamt es alle Musterübereinstimmungen.

    
Abhinav Gupta 15.07.2009 16:11
quelle

Tags und Links