Laden...

Problem mit Substring

Erstellt von jofenchel vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.656 Views
jofenchel Themenstarter:in
117 Beiträge seit 2005
vor 18 Jahren
Problem mit Substring

Hallo zusammen,

ich muss aus einem String den Namen eines Steuergeraetes extrahieren.
Ich bin an den Infos interessiert die nach S😘 kommen.
Also z. B. SAMH164 oder KL164 oder KIXAGW164.

Hier ein paar solcher String:

Ecu_Name(S:KL164);
Ecu_Name(S:KIXAGW164);
Ecu_Name(S:SAMH164);

Ich habe mir den Substring angeschaut und komme da nicht sehr weit.
Zu unflexibel.

Ich wollte urspruenglich mit String.Remove zum Ende des Strings springen und das irgenwie schauen das ich die Zeichen ");" entfernen kann.

Aber ehrlich ich habe nichs in MSDN gefunden.

JoFenchel

A
57 Beiträge seit 2005
vor 18 Jahren

Reguläre Ausdrücke (Regex) helfen Dir da bestimmt weiter.

grüße Olli

4.221 Beiträge seit 2005
vor 18 Jahren

string.IndexOf in Kombination mit string.Substring müsste auch gehen

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

830 Beiträge seit 2005
vor 18 Jahren

Hallo zusammen,

wenn die Strings immer so aufgebaut sind, wie wäre es dann hiermit :


string[] strA = str.Split(new char[]{':',')'},3);
System.Windows.Forms.MessageBox.Show(strA[1]);

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

563 Beiträge seit 2004
vor 18 Jahren

ne scheisse hingeschrieben, sry --> delete 🙂

P
96 Beiträge seit 2005
vor 18 Jahren

Hallo,

habe auch eine Lösung mit RegEx, da ich das demnächst
in ähnlicher Form auch brauchen werde.:


private string GetExpressionGroupStr(string MatchText, string Expression, int GroupIndex)
{
	Regex re = new Regex(Expression);
	Match reMatch = re.Match(MatchText);
	return reMatch.Groups[GroupIndex].Value;
}
private void button1_Click(object sender, System.EventArgs e)
{
	string str = "Ecu_Name(S:SAMH164);";
	string res = GetExpressionGroupStr(str ,"^.*:(.*)\\)",1);
	MessageBox.Show(res);
}

P
939 Beiträge seit 2003
vor 18 Jahren

Ich würde als Regex folgenden nehmen:

(?<=Ecu_Name\(S:)[^)]*

(?≤Ecu_Name(S:) ist ein positiver Lookbehind:

  • eine Gruppe, die auf ("Ecu_NameS:" matcht, die aber nicht im Ergebnis auftaucht.

([^)]*){blue} greift sich alles, was keine "runde Klammer zu" ist.

Die Matches des Regex sind genau die Strings, die du haben möchtest. Also "SAMH164", "KL164" und "KIXAGW164".

private static Regex ecuNameRegex = new Regex(
   @"(?<=Ecu_Name\\(S:)[^)]*", 
   RegexOptions.Compiled);

private List GetEcuNames(string text) {
   List ecuNames = new ArrayList();
   foreach(Match m in ecuNameRegex.Matches(text)) {
      ecuNames.Add(m.Value);
   }
   return ecuNames;
}

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo jofenchel,

dein aktuelles Problem ist doch sehr ähnlich zu deinem in Negierte Zeichen .

Ich habe mir vor zwei Tagen das Buch [Reguläre Ausdrücke] von O'Reilley bestellt.

Dann ist es wohl noch nicht angekommen 🙂 schelmischguck

herbivore

4.221 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
Dann ist es wohl noch nicht angekommen 🙂 schelmischguck

herbivore

LOL

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

jofenchel Themenstarter:in
117 Beiträge seit 2005
vor 18 Jahren
Buch bestellt

Hallo Herbivore und Programmierhans,

das Buch ist angekommen.
Aber ich bin ehrlich und habe noch nicht viel darin gelesen.
Ich kaempfe gerade mit C#.

JoFenchel

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

Hallo Pulpapex,

der Regex funktioniert.

Hallo Pumi,

der Regex hat bei mir nicht geklappt.
Aber eine Frage zum GroupIndex.
Mit 1 willst du nur das erste Vorkommen bei mehreren Treffern?
Ist das so richtig?

Gruss
JoFenchel

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo jofenchel,

nein, mit 1 bekommst du den Inhalt des ersten Klammerpaars. Sowas steht aber auch in der Doku.

herbivore

P
96 Beiträge seit 2005
vor 18 Jahren

Hallo jofenchel,

die RegEx geht nicht, weil irgend jemand hier
dir Backslashes schluckt.
Wenn du vor dem String ein @ machst, dann geht es.

Die Funktion gibt dir die Matchings auf die Klammerpaare.
Bei Suche nach 12 würde (1)(2) folgendes geben:
Gruppe0:12
Gruppe1:1
Gruppe2:2

Gruesse pumi