2017-02-23 1 views
1

Ich versuche, einen regulären Ausdruck für das folgende Muster zu schreiben:Wie findet man eine bestimmte Zeichenfolge gefolgt von einer Zahl mit einer beliebigen Anzahl von Zeichen zwischen?

[MyLiteralString] [0 oder mehr Zeichen ohne Einschränkung] [mindestens 1 Stelle]

Ich dachte, das sollte es tun :

(theColumnName)[\s\S]*[\d]+ 

Da es für die Zeichenkette theColumnName, gefolgt von einer beliebigen Anzahl von Zeichen (Leerzeichen oder auf andere Weise), und dann mindestens eine Ziffer aussieht. Aber das entspricht mehr als ich will, wie Sie hier sehen können:

https://www.regex101.com/r/HBsst1/1

(EDIT) Zweiter Satz komplexer Daten - https://www.regex101.com/r/h7PCv7/1

die Beispieldaten in diesen Link verwenden, möchte ich die Regex um die zwei Vorkommen von theColumnName] VARCHAR(10) und nichts mehr zu identifizieren.

Ich habe mehr als 300 SQL-Skripte, die Anweisungen für jede Art von Datenbankobjekt erstellen enthält: Prozeduren, Tabellen, Trigger, Indizes, Funktionen - alles. Aus diesem Grund kann ich mit meiner Regex nicht zu streng sein.

Die Datei einer gespeicherten Prozedur könnte Text wie LEFT(theColumnName, 10) enthalten, den ich identifizieren möchte.

Eine Anweisung create table wäre wie theColumnName VARCHAR(12).

Es muss also sehr flexibel sein, da die Anzahl (n) nicht immer gleich ist. Manchmal ist es 10, manchmal ist es 12, manchmal sind es 51 - alle Arten unterschiedlicher Zahlen.

Grundsätzlich bin ich der Suche nach dem regulären Ausdruck Äquivalent dieser C# -Code:

//Get file data 
string[] lines = File.ReadAllLines(filePath); 

//Let's assume the first line contains 'theColumnName' 
int theColumnNameIndex = lines[0].IndexOf("theColumnName"); 

if (theColumnNameIndex >= 0) 
{ 
    //Get the text proceeding 'theColumnName' 
    string temp = lines[0].Remove(0, theColumnNameIndex + "theColumnNameIndex".Length; 

    //Iterate over our substring 
    foreach (char c in temp) 
    { 
     if (Char.IsDigit(c)) 
      //do a thing 
    } 
} 

Antwort

3
(theColumnName).*?[\d]+ 

Das wird es nach der ersten Nummer Erfassung stoppen sie sieht. Der Unterschied zwischen * und *? ist über Gier gegen Faulheit. .*\d zum Beispiel würde abcd12ad4 in abcd12ad4 entsprechen, während .*?\d seine erste Übereinstimmung als abcd1 haben würde. Weitere Informationen finden Sie unter this page.

Btw, wenn Sie Sie Zeilenumbrüche nicht wollen übereinstimmen, verwenden Sie einen . (Zeit) statt [\s\S]

Verwandte Themen