Hallo zusammen!
Ich habe folgende Beispieldaten:
pdgv.VisibleColumns[1].ColumnName.Trim().ToLower() == Tables.GeräteAusrüstung.Fabrikat.ToLower()
pdgv.VisibleColumns[2].ColumnName.Trim().ToLower() == Tables.GeräteAusrüstung.Fabrikat
pdgv.VisibleColumns[3].ColumnName.Trim().ToLower() == Tables.GeräteAusrüstung.Fabrikat.Trim().ToLower()
Ich benötige nun einen Regex, welcher mir die mittlere Zeile ausspuckt. Die Kriterien sind recht einfach: links von '==' steht ToLower und rechts steht 'Table' aber nicht 'ToLower'.
Ich bin mit Regex nicht so firm, was ich mir bisher zusammengebaut habe sieht so aus:
(.?ToLower.?(==|!=) Tables.*?(?!ToLower))
Leider liefert mir dieser Regex alle drei Zeilen als Ergebnis, kann mir bitte jemand helfen und sagen, wo das Problem liegt? Ich möchte bitte keine Debatten, wie häßlich der Beispielcode ist, ich benötige genau diesen Regex, um aufzuräumen und das ganze System peu à peu auf einen OR-Mapper umzubauen.
Gruß Rabenschwinge
Hallo Rabenschwinge,
du kannst mal hier [Artikel] Regex-Tutorial und mal hier On-the-fly Regex-Tester: Regex-Lab schauen, das hilft dir sicherlich weiter.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
@Coffeebean: Danke für die Links, das Tutorial hatte ich vor dem Post schon durchgeackert, leider finde ich den Fehler nicht. Ich verwende auch Expresso als Testumgebung.
Hi Rabenschwinge,
wie wäre es mit einem Matching aufs Zeilenende mit Negative Lookbehind?
^(.*ToLower\(\).*)(==|!=)(.*Tables.*)(?<!ToLower\(\))$
zusammen mit RegexOptions.Multiline.
beste Grüße
zommi
Hallo Zommi,
vielen Dank, das bringt mich jetzt schon sehr viel weiter. Leider funktioniert das aber nur, wenn am Ende wirklich nur ToLower() steht, da kann aber noch was kommen.
^(.*ToLower\(\).*)(==|!=)(.*Tables.*)(?<!ToLower\(\))(.*)$
Das selektiert mir wieder alles.
Gruß Rabenschwinge
Dann kombiniere doch das .*
mit dem !ToLower\(\)
:
^(.*ToLower\(\).*)(==|!=)\WTables(.(?!ToLower\(\)))*$
Wobei ab irgendwann ein einfaches String.Split bei == bzw. != mit anschließendem Contains(...) für "ToLower()" und "Tables" auf beiden Seiten sicherlich lesbarer ist.
beste Grüße
zommi
@zommi: Vielen Dank, das ist es. Ich muss mir nochmal genau durchlesen, was du mir da jetzt gezeigt hast. Ich versteh es noch nicht ganz. Aber das macht, was es soll.
Vielen Dank nochmal.
Gruß Rabenschwinge
^ Zeilenanfang
(.*ToLower\(\).*) Irgendwas wo "ToLower()" drin vorkommt
(==|!=) == oder !=
\WTables Whitespace + "Tables"
(.(?!ToLower\(\)))* Irgendein Zeichen, das nicht direkt von "ToLower()" gefolgt wird - beliebig oft
(aka Irgendwas wo "ToLower()" nicht drin vorkommt)
$ Zeilenende
beste Grüße
zommi