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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Waldemar Kalov (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Waldemar Kalov schrieb:
> foreach(char Letter in meinText)

das brauchst du doch überhaupt nicht.

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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: HS Ulm) (reggie)


Bewertung
0 lesenswert
nicht lesenswert
Schau dich auch mal im namespace Linq um. Der beinhaltet auch lauter 
solcher Spielereien.

von Reginald L. (Firma: HS Ulm) (reggie)


Bewertung
0 lesenswert
nicht lesenswert
...und bezüglich regulärer ausdrücke gibt es die klasse Regex.

von c-hater (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Perlen vor die Säue.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.