2016-05-25 10 views
1

Ich habe folgendes:String.IndexOf genaue Übereinstimmung

string text = "Select [id] AS [FROMId] FROM [TASK] ORDER BY id" 

und ich möchte text.IndexOf("FROM") verwenden, um die FROM beginnt zu finden, wo.

Ich möchte die Position von FROM und nicht die Position von FROMED finden.

LastIndexOf oder FirstIndexOf sind nicht die richtigen Antworten bewirken, dass der Text könnte alles sein wie

string text = @"Select [id] AS [FROMId], 
       newId as [newFROMId] FROM [TASK] ORDER BY [FROMId]" 

ich die IndexOf benötigen exakte Anpassung zu tun.

Irgendwelche Ideen?

+0

Wie wäre es mit Regex mit einem [Word-Grenze '\ b'check] (http://www.regular-expressions.info/wordboundaries.html)? Wie z.B. '" \ bFROM \ b "' als das Muster. –

+1

@Uwekeim, ich vermute, alle Randfälle werden am besten mit einem richtigen Parser gemacht. Selbst Wortgrenzen helfen nicht mit 'select 'hat Daten von der Einheit' | Einheit von dtable ... '. – paxdiablo

Antwort

-1

Wenn Sie nur einen Raum hinzufügen, so sieht es aus wie

int index = text.IndexOf("FROM ") - 1 

-1, weil Sie die "" (Leerzeichen) haben.

+1

Sie sollten in diesem Fall keine * subtrahieren. – paxdiablo

1

Seit FROM ist ein reserviertes SQL-Wort, die Leerzeichen im Allgemeinen auf beiden Seiten haben wird, Sie für diese dann aussehen könnte, denn das wird Ihnen die Adresse des Raumes vor die F, fügen Sie eine die Lage zu bekommen, die F selbst:

int index = text.IndexOf(" FROM ") + 1 

Dies kann nicht unbedingt kümmern alle Grenzfälle (a) aber, dass richtig zu machen, können Sie eine SQL-Parser implementieren müssen, um sicherzustellen, dass Sie richtig das finden können Echt from Stichwort und unterscheiden es von anderen Möglichkeiten.


(a) Solche Dinge wie:

select [a]FROM[tble] ... 
select 'got data from unit #' | unit from tbl ... 

und so weiter.

+0

Bist du sicher? Wie wäre es mit '\ t',' \ r' oder '\ n'? –

+0

Auch: 'SELECT * FROM [MyTable]' funktioniert auch in SQL Server, zum Beispiel. –

+0

@Uwe Keim Können Sie mehr Details angeben? Die Antworten von Paxdiablo und Murf haben funktioniert, aber sie sind ein wenig hacky –

Verwandte Themen