Forum: PC-Programmierung c#: substring unbekannter länge aus string entfernen


von Waldemar Kalov (Gast)


Lesenswert?

Hi,
die Überschrift ist etwas verwirrend, was ich möchte ist folgendes.
Ich habe eine Datei mit HTML-Elementen. in dieser Datei ist eine 
Vielzahl an Einträge wie z.B. <p class=...>

Was diese Einträge alle gmeinsam habe ist, dass sie mit "<p " beginnen 
und mit '>' aufhören.

Wie kann ich das aus einem string heraus löschen?

bsp:
string c = "typ: 0815 color: rot <p class="Device1"> pieces: 24"

das <p class=Device1> würde ich gerne heraus löschen...

von Peter II (Gast)


Lesenswert?

Waldemar Kalov schrieb:
> Wie kann ich das aus einem string heraus löschen?

suche "<p"
wenn gefunden suche ab der stelle ">"

wenn gefunden substring mit den errechneten längen.

als Alternative kann man auch mit regulären ausdrücken arbeiten 
"<p[^>]*>"

von Waldemar Kalov (Gast)


Lesenswert?

Hallo,
Danke für Deine Hilfe, aber ich verstehe das nicht ganz.
Ich wollte ursprünglich mit einer Schleife nach den Zeichen suchen, aber 
wenn ich per schleife den string durchsuche, dann weiß ich doch nicht an 
welcher Stelle ich mich gerade befinden wenn ich einen treffen mit '<' 
gefunden habe?
1
foreach (char Letter in Text)
2
{
3
  if (Letter == '<')
4
  {
5
    // wie kann ich ich jetzt nach '>' suchen!?
6
  }
7
}

Was meinst Du mit
> als Alternative kann man auch mit regulären ausdrücken arbeiten
> "<p[^>]*>"

von Dirk B. (dirkb2)


Lesenswert?

Waldemar Kalov schrieb:
> Ich wollte ursprünglich mit einer Schleife nach den Zeichen suchen,

Du willst das selber machen und keine fertige Methode nehmen?
Ok.

> aber
> wenn ich per schleife den string durchsuche, dann weiß ich doch nicht an
> welcher Stelle ich mich gerade befinden wenn ich einen treffen mit '<'
> gefunden habe?

Dann musst du eben mitzählen, oder eine andere Schleife verwenden.
evtl. eine, wo du den Index durchgehst.


> Was meinst Du mit
>> als Alternative kann man auch mit regulären ausdrücken arbeiten
>> "<p[^>]*>"
Er meinte Reguläre  Ausdrücke (bitte selber googeln oder in 
Wikipedia nachschlagen)


Es gibt aber in der String-Klasse fertige Methoden, die dir den Index 
eines Zeichens liefern.

: Bearbeitet durch User
von blubb (Gast)


Lesenswert?

Dirk B. schrieb:
> Reguläre  Ausdrücke

'regular expressions' ist das Wort womit man mehr infos finden sollte

Wäre aber auch meine erste Wahl gewesen :)

von Peter II (Gast)


Lesenswert?

Waldemar Kalov schrieb:
> welcher Stelle ich mich gerade befinden wenn ich einen treffen mit '<'
> gefunden habe?

du must mit String.IndexOf arbeiten.

von Waldemar Kalov (Gast)


Lesenswert?

Hallo,
vielen Dank!
Peter II hat mir den entsprechenden Hinweis geliefert:


1
foreach(char Letter in meinText)
2
{
3
    if (Letter == '<')
4
    {
5
        int Start = meinText.IndexOf('<');
6
        int Ende = meinText.IndexOf('>');
7
8
        meinText = meinText.Remove(Start, (Ende+1) - Start);
9
    }
10
}

von Peter II (Gast)


Lesenswert?

Waldemar Kalov schrieb:
> foreach(char Letter in meinText)

das brauchst du doch überhaupt nicht.

von Dirk B. (dirkb2)


Lesenswert?

.IndexOf gibt es in verschiedenen Variationen. Unter anderem auch mit 
einem zweiten Parameter vom Typ int32.

https://msdn.microsoft.com/de-de/library/5xkyx09y.aspx

von Peter II (Gast)


Lesenswert?

so ist es sinnvoller
1
int pos = meinText.IndexOf('<');
2
while( pos > 0 ) {
3
        int Ende = meinText.IndexOf('>');
4
        meinText = meinText.Remove(Start, (Ende+1) - Start);
5
        pos = meinText.IndexOf('<');
6
}

von Peter II (Gast)


Lesenswert?

Peter II schrieb:
> int pos = meinText.IndexOf('<');
> while( pos > 0 ) {
>         int Ende = meinText.IndexOf('>');
>         meinText = meinText.Remove(Start, (Ende+1) - Start);
>         pos = meinText.IndexOf('<');
> }

korrektur
[/c]
int pos = meinText.IndexOf('<');
while( pos > 0 ) {
        int Ende = meinText.IndexOf('>',pos  );
        meinText = meinText.Remove(Start, (Ende+1) - Start);
        pos = meinText.IndexOf('<');
}

von Dirk B. (dirkb2)


Lesenswert?

Ein Test, ob Ende gültig ist, sollte auch noch drin sein.

Und das gesuchte Zeichen könnte ja durchaus auch an der ersten Stelle 
stehen.

: Bearbeitet durch User
von Arc N. (arc)


Lesenswert?

Oder einen passenden Parser nehmen z.B. 
http://htmlagilitypack.codeplex.com/wikipage?title=Examples oder das 
WebBrowser-Control nehmen, DocumentText setzen und, nachdem es 
geladen/geparst ist, über Document und bspw. über GetElementsByTagName 
die passenden raussuchen
https://msdn.microsoft.com/de-de/library/system.windows.forms.webbrowser.documenttext(v=vs.110).aspx
https://msdn.microsoft.com/de-de/library/system.windows.forms.htmldocument(v=vs.110).aspx

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Schau dich auch mal im namespace Linq um. Der beinhaltet auch lauter 
solcher Spielereien.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

...und bezüglich regulärer ausdrücke gibt es die klasse Regex.

von c-hater (Gast)


Lesenswert?

Waldemar Kalov schrieb:

> Was diese Einträge alle gmeinsam habe ist, dass sie mit "<p " beginnen
> und mit '>' aufhören.
>
> Wie kann ich das aus einem string heraus löschen?

Alle im Thread aufgezeigten Möglichkeiten sind mehr oder weniger 
mangelhaft, allerdings unter bestimmten Randbedingungen durchaus 
einsetzbar. Das Problem ist nur: du mußt halt irgendjemanden finden, der 
dir die Einhaltung der Randbedingungen garantiert...

Die universelle Lösung kann deshalb nur ein vollständiger HTML-Parser 
zur Ermittlung der "Schnittstellen" sein. Alles andere ist hilfloses 
Gefrickel, was im nächsten Moment schon den Bach runtergehen kann...

von Puh (Gast)


Lesenswert?

Perlen vor die Säue.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.