Laden...

Alternativer Regex

Erstellt von jofenchel vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.877 Views
jofenchel Themenstarter:in
117 Beiträge seit 2005
vor 18 Jahren
Alternativer Regex

Hallo zusammen,

mein letztes Problem im Forum mit Regex ( IgnoreCase ) konnte ich loesen.
Nun habe ich nach mehrfachen probieren und test keine Loesung fuer mein neues Problem finden koennen und benoetige etwas Hilfe.

Folgender Regex habe ich erstellt:

Regex check = new Regex( "SG_Teilenr\\(\\(ecu_name | ecu\\):S:"+ ecu, RegexOptions.IgnoreCase );

Dieser Regex soll aus einem String alles finden wo an der bestimmen Stelle entweder ecu oder ecu_name anthalten sind.
Funktioniert aber nicht. Der Regex findet nichts.

Irgendwie stimmt die Syntax nicht so ganz. Einen Kompilerfehler bekomme ich nicht.

Hat jemand einen Tip.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo jofenchel,

wenn du Leerzeichen in den Pattern schreibst, müssen auch in dem String Leerzeichen stehen. Das ist vermutlich nicht erwünscht.

Außerdem musst du um eine Alternative Klammern schreiben, also z.B.

(ecu_name|ecu)

Wenn du eine Klammer mit Backslash davor in den Pattern schreibst, muss auch in dem String eine Klammer stehen. Das ist nicht unbedingt erwünscht.

herbivore

M
1.439 Beiträge seit 2005
vor 18 Jahren

hi,
du kannst den Ausdruck auch vereinfachen indem du eco[_name] schreibst, wird vermutlich ein bischen schneller sein 😉.
Oder du verwendest einfach String.IndexOf().

P
939 Beiträge seit 2003
vor 18 Jahren

"eco[name]" findet nicht "eco" und auch nicht "eco_name", sondern z.B. "eco".

@jofenchel: neben dem was herbivore geschrieben hat, irritiert mich noch das "+ ecu".

Ganz allgemein; Regexes dynamisch zusammen zu bauen, ist keine gute Idee, ist zu rechenaufwändig. Poste mal paar Beispielzeilen und dazu welche wie gematcht werden sollen und welche nicht (den Regex nicht im CSharp-Codeblock schreiben, der verschluckt die Backslashes).

jofenchel Themenstarter:in
117 Beiträge seit 2005
vor 18 Jahren
So klappts

Hallo Herbivore,

dein vorschlag hat funktioniert.

[php][PHP]Regex check = new Regex( "SG_Teilenr\((ecu|ecu_name):S:" +ecu, RegexOptions.IgnoreCase );[/php]

Der Vorschlag von marsgk klappt nicht.

Hier ein paar Beispielzeilen.
Sind Zeilen aus einem Trace.
MIt +ecu waehle ich das Steuergeraet aus von welchem ich die Teilenummer haben will.
Z.B. KI164 oder KL164 oder DBE164.

ecu = Console.ReadLine();
Spaeter wenn der Regex soweit steht will ich aus einer Datei einlesen.

Hier die Beispielzeilen:

[php]
string [] s = { "*IP1 CallHDF: CAE_GetRevision(s_ECU:S:DBE164 S:1.03.1",
"*IP2 TRY HDF: CAE_GetRevision(s_ECU;S:SGML)",
"*IP3 CallHDF: SG_Teilenr(ecu:S:KI164) S:1645400711",
"*IP4 CallHDF: SG_Teilenr(ecu:S:KL164) S:1645400733",
"*IP5 CallHDF: SG_Teilenr(ecu_name:S:KL164) S:1645400733",
"*IP6 CallHDF: CAE_GetRevision(s_ECU:S:MRM164",
"*IP7 CallHDF: SG_Teilenr(ecu:S:KI164) S:1645400711",
"*IP8 KI KI KI" };
[/php]

M
1.439 Beiträge seit 2005
vor 18 Jahren

Original von Pulpapex
"eco[name]" findet nicht "eco" und auch nicht "eco_name", sondern z.B. "eco".

hehehe stimmt, hab wohl schon zu viel Zeit mit EBNF verbracht.