Laden...

[gelöst] Regex: Probleme mit Suchstring

Erstellt von Rabenschwinge vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.183 Views
R
Rabenschwinge Themenstarter:in
27 Beiträge seit 2008
vor 9 Jahren
[gelöst] Regex: Probleme mit Suchstring

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

2.207 Beiträge seit 2011
vor 9 Jahren

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

R
Rabenschwinge Themenstarter:in
27 Beiträge seit 2008
vor 9 Jahren

@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.

1.361 Beiträge seit 2007
vor 9 Jahren

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

R
Rabenschwinge Themenstarter:in
27 Beiträge seit 2008
vor 9 Jahren

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

1.361 Beiträge seit 2007
vor 9 Jahren

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

R
Rabenschwinge Themenstarter:in
27 Beiträge seit 2008
vor 9 Jahren

@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

1.361 Beiträge seit 2007
vor 9 Jahren

^                       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