2016-10-05 8 views
0

Wir haben einige Protokollierungsservice von einer API, die einige Probleme beim Abfangen der Datenbank hat, auf die eine Abfrage zugreift.So extrahieren Sie ein Wort aus einer Zeichenfolge

Say, eine Abfrage kommt wie folgt aus:

Select Top 10 * From DataBase..Table 

Was ich möchte, ist erreichen, um „DataBase“ oder den Text vor dem „..“ auf der Saite.

Auch, manchmal eine Abfrage kommt wie folgt aus:

Select Top 10 * From DataBase.Schema.Table 

Ist es möglich, die „DataBase“ string auf beiden Fällen zu bekommen?

Hier ist, was ich versucht habe zu tun, aber ich nicht so gut in regulären Ausdrücken.

([A-Z]+\.+?([A-Z])*(\.)+[A-Z]) 

Aber das paßt zu folgenden (auf eckige Klammern):

Select Top 10 * From [DataBase..T]able 

Danke für die Hilfe!

Bearbeiten: Dies geschieht in C#, vor dem Senden der Abfrage/Anfrage an die Datenbank, wir versuchen, jede Anfrage dieser API-Methode zu protokollieren.

+3

SQL ist eine komplexe Sprache, und der Versuch, es mit einem direkten String-Ansatz wie Regex zu analysieren, kann riskant sein, die vertrauenswürdigste Methode ist die Verwendung eines SQL-Parsers. Für Ihre spezifische Frage mit Ihrem spezifischen Beispiel schlage ich vor, das Schlüsselwort "Von" zu verwenden, um Ihr Muster zu starten und (in einer Erfassungsgruppe) alles zu nehmen, was kein Punkt nach irgendeiner Anzahl von Leerzeichen ist. –

+0

Dies geschieht in C#. Es ist eine API, die Anfragen erfasst und sich vor dem Abfragen der Datenbank in einer Datei anmeldet. Es ist nicht in SQL Server getan, tut mir leid, wenn ich nicht klar war. –

+0

Datenbankname kann ein beliebiges Zeichen einschließlich Punkt enthalten. Eine allgemeinere und naivere Herangehensweise besteht darin, die Teilstrings zwischen "von" und "." Zu finden, aber beachte, dass eine Datenbank auch "[FROM. ] ' – Slai

Antwort

0

Wie es im Kommentar erwähnt wird, ist das Parsen von SQL auf diese Weise eine schlechte Idee aufgrund der Komplexität, auf die Sie stoßen können. Aber wenn dies etwas ist, was Sie tun möchten, sollte folgendes funktionieren. Es funktioniert für select oder delete Anweisungen, einfügen/update funktioniert nicht, da sie eine andere Struktur haben.

+0

Ich benutze etwas sehr ähnliches zu diesem Geldautomaten, aber ich frage mich, ob es einen REGEX gibt, um das zu erreichen, ohne den Aufwand zu haben, die Zeichenfolge und so weiter zu trennen. Vielen Dank! –

Verwandte Themen