Absätze aus String entfernen C#

OP #4250445
Lesenswert?
• ▲
▼
Hallo Gemeinde,

Mit
1
MyserialPort.readexisting();
 empfange ich eine Zeichenkette welche 3 Zeilen enthält.
Wie kann ich die 2 Zeilenumbrüche löschen?
Will danach den string auf eine bestimmte Stelle trimen.
so trimt er jetzt jede Zeile...

Danke im Voraus!

Gruss
Dani
Gast #4250496
Lesenswert?
• ▲
▼
Das ist eine der ersten Fingerübungen, die man macht wenn man eine 
Programmiersprache lernt. Wenn sowas hier gefragt wird, dann ist ganz 
klar, der TO will nicht programmieren lernen sondern mit copy & paste 
was zusammenfrickeln ohne selbst was dafür zu investieren.
Guttemberg lässt grüssen.
OP #4250513
Lesenswert?
• ▲
▼
Danke!
klappt jetzt!

Kann ich auch aus einem String eine gewisse zeichenfolge heraus filtern?

Z.b. so:

Test 1234 xx:xx:xx:xx:xx tset

und ich möchte nur das hier haben: xx:xx:xx:xx:xx


Problem der ganzen Sache ist, wenn ich den String zuschneide kann ich 
nur eine MAC Adresse anzeigen, ich möchte aber mehrer dann in eine 
Listbox einfügen...


Gruss
Dani
Gast #4250521
Lesenswert?
• ▲
▼
Hä? Wie sieht denn Dein ursprünglicher String aus?

so?

Test1 1234 xx:xx:xx:xx:xx tset1
Test2 2345 xx:xx:xx:xx:xx tset2
Test3 3456 xx:xx:xx:xx:xx tset3

warum willst Du dann als erstes die Zeilenumbrüche entfernen, wenn Du an 
die MAC-Adressen willst. Verarbeite doch einfach Deinen Eingangsstring 
zeilenweise und schneide Die Zeilen entsprechend zu...
OP #4250535
Lesenswert?
• ▲
▼
INQUIRY_PARTIAL 0c:14:20:22:1d:62 200404
INQUIRY_PARTIAL 2c:54:cf:7b:3f:70 5a020c
INQUIRY 2
INQUIRY 0c:14:20:22:1d:62 200404
INQUIRY 2c:54:cf:7b:3f:70 5a020c


So schaut mein String aus ... am Anfang nicht gleich lang...

von hinten abschneiden und dann nur die mac Adressen rauskopieren ?
würde das gehen?

Gruss

Dani
Gast #4250536
Lesenswert?
• ▲
▼
Uhu U. schrieb:
> Das wird aber mit Replace nicht klappen, wenn das Muster nicht passt.

Er könnte z.B. alle \r durch nichts ersetzen und alle \n durch ein 
Blank.
Dann würde es bei Unix und Win passen. Wie ist das mit Apple, haben die 
nicht nochmal andere Zeilenumbrüche?
Gast #4250538
Lesenswert?
• ▲
▼
Daniel R. schrieb:
> von hinten abschneiden und dann nur die mac Adressen rauskopieren ?
> würde das gehen?

Schon mal was von regulären Ausdrücken gehört.
Dann lies dich mal ein, das kann auch C#. Suche einfach nach Ausdrücken 
in der Form aa:bb:cc:dd:ee:ff oder aa:bb:cc:dd
Wie das geht ist ne schöne Übung um was zu lernen.
Gast #4250564
Lesenswert?
• ▲
▼
Wenns "schön" sein soll, würde ich's mit Regular Expressions machen.
Wenn's nur Quick&Dirty sein muss, so (Python):
1
adresses = list()
2
for line in inputString:
3
    teile = line.split(" ")
4
    if len(teile > 2):
5
        addresses.append(teile[1])

Die entsprechenden Funktionen gibt es bestimmt auch in C#...
OP #4250634
Lesenswert?
• ▲
▼
wie kann ich das jetzt so hinbiegen das er aus einem String die 
Mac-Adresse filtert?
Schreibt jetzt nur WENN NUR eine MAC-Adresse kommt
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading.Tasks;
6
using System.Text.RegularExpressions;
7

8
namespace nach_muster_im_string_suchen_konsole
9
{
10
    class Program
11
    {
12
        static void Main(string[] args)
13
        {
14
            string eingabe = Console.ReadLine();
15

16
          
17
            var addMacReg = "^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$";
18
            Regex regex = new Regex(addMacReg);
19
          
20
            Match match = regex.Match(eingabe);
21
            if (match.Success)
22
            {
23
                Console.WriteLine(match.Value);
24
                Console.WriteLine("es war eine mac adressae dabei");
25
            }
26
          //  Console.WriteLine(eingabe);
27
            Console.ReadKey();
28

29
        }
30
    }
31
}
Gast #4250658
Lesenswert?
• ▲
▼
Tcf K. schrieb:
> @DerAndere: Imho hatten die früher nur \r bin aber nicht sicher.

Sowas hatte ich auch im Kopf. Völlig bescheuert, ja anders machen als 
alle anderen um möglichst inkompatibel zu sein.
Dem Idioten, der sich das ausgedacht hat gehört Prügel, genau wie dem, 
der sich ausgedacht hat in Windows in Pfaden und Dateinamen Blanks als 
gültige Zeichen zuzulassen.
Gast #4250670
Lesenswert?
• ▲
▼
Daniel R. schrieb:
> wie kann ich das jetzt so hinbiegen das er aus einem String die
> Mac-Adresse filtert?
> Schreibt jetzt nur WENN NUR eine MAC-Adresse kommt

Weil ^ und $ Zeilenanfang und Zeilenende markieren. Ich finde es aber 
gut, dass du dich in Bezug auf Regex informiert hast.
So sollte es funktionieren, denke ich:
1
static class Extensions
2
{    
3
  public static string ExtractMac(this string input)
4
  {      
5
    var match = MacRegex.Match(input);
6
    return match.Success ? match.Value : string.Empty; // oder null statt string.Empty
7
  }
8

9
  static readonly Regex MacRegex = new Regex("([0-9a-f]{2}:){5}([0-9a-f]{2})");
10
}
11

12
class Program
13
{
14
  static void Main(string[] args)
15
  {
16
    string str = "INQUIRY_PARTIAL 0c:14:20:22:1d:62 200404";
17

18
    var mac = str.ExtractMac();
19

20
    if (!string.IsNullOrEmpty(mac)) Console.WriteLine("MAC gefunden: " + str.ExtractMac());
21
    else Console.WriteLine("Keine MAC gefunden.");
22
}
Gast #4250723
Lesenswert?
• ▲
▼
Daniel R. schrieb:
> Wenn mehrere Geräte sichtbar sind bekomm ich mehrere MAC Adressen in
> einen String...

Zeilenweise, wie oben beschrieben (d.h., der Input war wie im Beispiel 
und du hast die Zeilen nicht selbst umgebrochen)? Wenn nicht, 
funktioniert mein Vorschlag so nicht ...

> aber wie kann ich mehrere Mac Adressen einlesen?

Nur über Regex ginge es zwar (man muss dann natürlich iterieren), aber 
das ist meiner Meinung nach hier unnötig kompliziert. Ich würde einfach 
in Zeilen splitten und dann für jede Zeile ExtractMac aufrufen.

1
static class Extensions
2
{    
3
  public static string ExtractMac(this string input)
4
  {      
5
    var match = MacRegex.Match(input);
6
    return match.Success ? match.Value : string.Empty; // oder null statt string.Empty
7
  }
8

9
  public static IEnumerable<string> GetLines(this string input)
10
  {
11
    // Evtl. noch nachsehen, wie bei dir die Zeilen getrennt sind, siehe Diskussion oben.
12
    return input.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
13
  }
14

15
  static readonly Regex MacRegex = new Regex("([0-9a-f]{2}:){5}([0-9a-f]{2})");
16
}
17

18
class Program
19
{
20
  static void Main(string[] args)
21
  {
22
    // Beispiel
23

24
    string str = @"INQUIRY_PARTIAL 0c:14:20:22:1d:62 200404
25
INQUIRY_PARTIAL 2c:54:cf:7b:3f:70 5a020c
26
INQUIRY 2
27
INQUIRY 0c:14:20:22:1d:62 200404
28
INQUIRY 2c:54:cf:7b:3f:70 5a020c";
29

30
  var lines = str.GetLines();
31
  List<string> macs = new List<string>();
32

33
  foreach(var line in lines)
34
  {
35
    string mac = line.ExtractMac();
36
    if (!string.IsNullOrEmpty(mac)) macs.Add(mac);
37
  }
38

39
  // Alle gültigen Addressen sollten sich jetzt in "macs" befinden.
40

41
}

Falls die anderen Daten (INQUIRY_PARTIAL, INQUIRY, die zweite Zahl etc.) 
auch eine Rolle spielen , könnte man eine kleine Klasse schreiben, in 
der die jeweilige Zeile dann - evtl. gleich im Konstruktor - geparst 
wird (und die dann die entsprechenden Daten speichert).
Gast #4250911
Lesenswert?
• ▲
▼
Daniel R. schrieb:
> Wie kann ich jetzt die macs in z.b eine Textbox schreiben?!

Verwendest du Windows Forms oder WPF? Ich würde eher ein List-Control 
einsetzen.

Mit einer Textbox (wie Matthias schon angedeutet hat):
1
macTextBox.Text = string.Join(Environment.NewLine, macs);

Nicht vergessen, die Eigenschaft "Multiline" der Textbox auf true zu 
setzen.
OP #4253513
Lesenswert?
• ▲
▼
Moin Moin,

Funktioniert jetzt schon fast so wie ich will... warum löscht er den 
Eintrag in Macs wieder?
Wenn ich ein Haltepunkt auf macs setzte sehe ich das die Macs drinnen 
stehen aber wenn ich das Programm weiter laufen lasse löscht er diese 
wieder ?!

Wenn der String nicht mehr gelöscht wird,... wie kann ich diesen in ein 
Array umwandeln und dann in eine Listbox schreiben?

Ich arbeite auf der FORM

Gruss
Dani
Gast #4253791
Lesenswert?
• ▲
▼
Daniel R. schrieb:
> Funktioniert jetzt schon fast so wie ich will... warum löscht er den
> Eintrag in Macs wieder?
> Wenn ich ein Haltepunkt auf macs setzte sehe ich das die Macs drinnen
> stehen aber wenn ich das Programm weiter laufen lasse löscht er diese
> wieder ?!

Da wir dein Programm nicht kennen, kann man nur raten ... Vielleicht 
erzeugst du immer eine neue Instanz eine Liste (wie im Beispiel, aber 
das ist ja nur eine Konsolenanwendung, die das Prinzip zeigen sollte). 
Du musst die Liste in deinem Programm auf Klassenebene deklarieren bzw. 
auch gleich dort (oder im Konstruktor) initialisieren, nicht wie im 
Beispiel lokal in einer Methode.

class DeineKlasse
{
  // ...

  private List<string> macs = new List<string>();
}

Um den Inhalt der Liste zu löschen, kannst du macs.Clear() aufrufen.

> Wenn der String nicht mehr gelöscht wird,...

Welcher String? Meinst du den Inhalt der Liste?

> wie kann ich diesen in ein Array umwandeln und dann in eine Listbox
> schreiben?

Wenn die Daten in der Liste nicht mehr gelöscht werden, kannst du doch 
direkt die Liste verwenden. Oder die neuen Daten sofort in die Listbox 
setzen (in der Schleife, in der du die MACs zur Liste hinzufügst).

if (!string.IsNullOrEmpty(mac))
{
  macs.Add(mac);
  macListBox.Items.Add(mac);
}

Falls du die MACs wirklich nur anzeigen und nicht weiter verarbeiten 
willst, könntest du genau genommen auf die "macs"-Liste verzichten.

Den Inhalt der Listbox löschst du, wenn nötig, mit
macListBox.Items.Clear();
Das ist jetzt die einfachste Art und Weise, es geht auch eleganter 
(LINQ, Data-Binding, sortieren, filtern - evtl. doppelte Einträge 
möglich? -, ...). Aber da du offenbar noch mit den Grundlagen kämpfst, 
wäre so etwas wohl keine gute Idee. Evtl. solltest du erst einmal ein 
Tutorial zu C#-Grundlagen durcharbeiten, anstatt das Ganze übers Knie 
brechen zu wollen. Dann würdest du nicht so häufig festhängen ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren