Textstücke in einem NSString finden und entfernen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Textstücke in einem NSString finden und entfernen

    Hallo Liebe Leute und guten Morgen,

    Ich arbeite aktuell mit Maßketten in folgender Form und würde gerne die Bezeichner der Ab- bzw. Zuzüge in bestimmten Fällen entfernen, sodass diese nicht mit ausgegeben werden.

    Quellcode

    1. ​5,25 * 6,35
    2. - 0,80 * 1,00 # Fenster
    3. + (0,30 * 0,20) * 2,50 # Säule


    Ich würde gerne alles von der Raute bis zum Zeilenumbruch aus dem String entfernen.

    Gibts da gute Lösungsansätze für? danke.
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • gandhi schrieb:

    Wo ist das Problem?

    Das Problem scheint zu sein, dass es nicht zeilenweise Strings sind, sondern ein Gesamtstring.

    Mir fielen folgende Ansätze ein - etwa in meiner persönlichen Beliebtheitsreihenfolge, hängt etwas davon ab, in welcher Form ich den Text weiterverwenden wollte
    - NSScanner
    - NSRegularExpression
    - per componentsSeparatedByString (oder componentsSeparatedByCharactersInSet) zerlegen, filtern, dann wieder per componentsJoinedByString wieder zusammenfummeln
    - händisch mit den üblichen NSString-NSRange-Methoden
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    gandhi schrieb:

    Wo ist das Problem?

    Das Problem scheint zu sein, dass es nicht zeilenweise Strings sind, sondern ein Gesamtstring.

    Mir fielen folgende Ansätze ein - etwa in meiner persönlichen Beliebtheitsreihenfolge, hängt etwas davon ab, in welcher Form ich den Text weiterverwenden wollte
    - NSScanner
    - NSRegularExpression
    - per componentsSeparatedByString (oder componentsSeparatedByCharactersInSet) zerlegen, filtern, dann wieder per componentsJoinedByString wieder zusammenfummeln
    - händisch mit den üblichen NSString-NSRange-Methoden


    Richtig, es handelt sich um einen Gesamtstring.

    Ich hab mich leider grad für die letzte Variante entscheiden und bereue es grad schon... Interessieren würde mich folgendes aber schon:

    Kann ich eine NSRange ermitteln lassen ([string rangeOfString...]) und dabei angeben, dass nur nach einer bestimmten position (auch NSRange also) gesucht werden soll?

    Danke.
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Danke für die Tipps Mattik!

    Ich habe nun eine funktionierende händische Lösung implementiert.

    Würde mich über Feedback bzgl. des Codes freuen.

    Quellcode

    1. ​NSRange hashPosition, nlPosition;
    2. // Erste raute im String ermitteln
    3. hashPosition = [resultWithoutIdentifiers rangeOfString:@"#"];
    4. // Entspricht die Position der Raute der Stringlänge?
    5. if (hashPosition.location + hashPosition.length <= [resultWithoutIdentifiers length] && hashPosition.location != NSNotFound) {
    6. // Position vom auf die raute folgenden Zeilenumbruch ermitteln
    7. nlPosition = [resultWithoutIdentifiers rangeOfString:@"\n" options:nil range:hashPosition];
    8. while (hashPosition.location != NSNotFound) {
    9. // Nach dem bezeichner folgt keine neue Zeile mehr!
    10. if (hashPosition.location + ([resultWithoutIdentifiers length] - hashPosition.location) == [resultWithoutIdentifiers length]) {
    11. NSRange toDelete = NSMakeRange(hashPosition.location, [resultWithoutIdentifiers length] - hashPosition.location);
    12. [resultWithoutIdentifiers replaceCharactersInRange:toDelete withString:@""];
    13. }
    14. // Es folgen weitere Zeilen
    15. else {
    16. NSRange toDelete = NSMakeRange(hashPosition.location, nlPosition.location - hashPosition.location);
    17. [resultWithoutIdentifiers replaceCharactersInRange:toDelete withString:@""];
    18. }
    19. // Nächste raute ermitteln
    20. hashPosition = [resultWithoutIdentifiers rangeOfString:@"#"]; // Position der Raute
    21. // Falls eine Raute gefunden wurde, möglichen, darauf folgenden zeilenumbruch ermitteln
    22. if (hashPosition.location + hashPosition.length <= [resultWithoutIdentifiers length] && hashPosition.location != NSNotFound) {
    23. nlPosition = [resultWithoutIdentifiers rangeOfString:@"\n" options:nil range:hashPosition];
    24. }
    25. }
    26. }
    Alles anzeigen
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Wenn es geht, ist es ja schonmal gut. Soll nicht besserwisserisch sein, aber Du hattest um Kritik gebeten, daher etwas Genörgle:

    - Ich finde den Code ziemlich schwierig verständlich - und ich vermute, dass Du in drei Monaten auch etwas knobeln musst, um wieder nachzuvollziehen was da genau passiert.
    - Mir fällt auf, dass Du Dinge mehrfach tust, z.B. nach Hashes und Newlines zu suchen, das sollte man vermeiden... don't repeat yourself. Vielleicht wäre da ein do..while besser geeignet, damit man die erste Suche nicht davor machen muss.
    - Und: nach "\n" zu suchen kann problematisch sein - es gibt unterschiedliche Zeilencodierungen.

    Vielleicht doch ein Scanner? Hier ein rudimentäres Beispiel, das (in etwa) das gleiche tut, etwas kürzer und (nach meinem Geschmack) etwas verständlicher ist:

    Quellcode

    1. NSScanner* scanner = [NSScanner scannerWithString:orig];
    2. [scanner setCharactersToBeSkipped:nil];
    3. while (![scanner isAtEnd]) {
    4. NSString* chunk;
    5. if ([scanner scanUpToString:@"#" intoString:&chunk]) {
    6. //Comment found: Copy over up to comment, skip to newline
    7. [trimmed appendString:chunk];
    8. [scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:NULL];
    9. } else {
    10. //No more comment - copy remaining text, finish
    11. [trimmed appendString:[orig substringFromIndex:[scanner scanLocation]]];
    12. break;
    13. }
    14. }
    Alles anzeigen
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    Wenn es geht, ist es ja schonmal gut. Soll nicht besserwisserisch sein, aber Du hattest um Kritik gebeten, daher etwas Genörgle:

    - Ich finde den Code ziemlich schwierig verständlich - und ich vermute, dass Du in drei Monaten auch etwas knobeln musst, um wieder nachzuvollziehen was da genau passiert.
    - Mir fällt auf, dass Du Dinge mehrfach tust, z.B. nach Hashes und Newlines zu suchen, das sollte man vermeiden... don't repeat yourself. Vielleicht wäre da ein do..while besser geeignet, damit man die erste Suche nicht davor machen muss.
    - Und: nach "\n" zu suchen kann problematisch sein - es gibt unterschiedliche Zeilencodierungen.

    Vielleicht doch ein Scanner? Hier ein rudimentäres Beispiel, das (in etwa) das gleiche tut, etwas kürzer und (nach meinem Geschmack) etwas verständlicher ist:

    Quellcode

    1. NSScanner* scanner = [NSScanner scannerWithString:orig];
    2. [scanner setCharactersToBeSkipped:nil];
    3. while (![scanner isAtEnd]) {
    4. NSString* chunk;
    5. if ([scanner scanUpToString:@"#" intoString:&chunk]) {
    6. //Comment found: Copy over up to comment, skip to newline
    7. [trimmed appendString:chunk];
    8. [scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:NULL];
    9. } else {
    10. //No more comment - copy remaining text, finish
    11. [trimmed appendString:[orig substringFromIndex:[scanner scanLocation]]];
    12. break;
    13. }
    14. }
    Alles anzeigen


    Hi Mattik,

    Ich habe drum gebeten, so sei es dir auch gestattet! :)

    Punkt 1: Das stimmt... ich bin selber noch nicht ganz glücklich damit gewesen... War aber erst mal froh, den offenen Fall gelöst zu haben, was die Funktionalität betrifft.
    Punkt 2: Auch da kann ich dir nur recht geben.
    Punkt 3: Aber wenn ich die \n selber im String "platziere" sollte das suchen nach eben diesen doch eigentlich klappen oder?

    Danke für das Beispiel, werde ich gleich mal probieren! :)

    Nachtrag: Klappt! Besten Dank :) Da werd ich mich doch glatt in der Freizeit mal näher mit beschäftigen :) Schaut ja doch zugegebener Maßen um einiges schlanker aus ^^
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DBocksteger ()