StringLower richtig einsetzen

  • Hallo Community,

    helft mir mal bitte etwas auf die Sprünge.

    Ich habe einen sehr langen String. Dort sollen allerdings nur ein paar Wörter gefunden und "umgeschrieben" werden.

    Der String enthält in einem Satz zweimal eine Städtenamen, dieser wird von unseren Programmen generell in kompletter Grosschrift ausgegeben. Nun soll der Name ordentlich umgewandelt werden.

    Aus BERLIN soll z.B. Berlin werden. Dafür gibts ja die Funktion StringLower. Damit wird ja aber der kompletter gefundene String klein geschrieben. Wie aber kann ich es realisieren, dass der erste Buchstabe gross bleibt und vor allem auch im restlichen (nicht unbedingt kurzen) String sollen alle Anfangsgrossbuchestaben natürlich weiterhin gross bleiben.

    Als Beispiel:

    Der String enthält unter anderem den folgenden Satz

    Die Transportkosten für Ihre Sendung von DE-36037 FULDA nach AT-5061 SALZBURG betragen 41.79 EUR

    Die Orte varriieren jedesmal doch ist die Grosschreibweise immer gleich. Der Satz soll also nun in folgenden gewandelt werden:

    Die Transportkosten für Ihre Sendung von DE-36037 Fulda nach AT-5061 Salzburg betragen 41.79 EUR

    Mit Stringlower würde ich ja den kompletten Text klein schreiben lassen... ich denke man muss hier wieder mit StringRegExp arbeiten - aber das Ding ist mir einfach zu hoch - auch wenn ich es schon hundert Mal angeschaut habe :(

    Danke für Eure Hilfe

    LG
    Mirko

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • AutoIt
    Func StringLower2($sInput)
    	Local $sOutput
    	$sOutput = StringLower($sInput)
    	Return StringUpper(StringLeft($sOutput, 1)) & StringTrimLeft($sOutput, 1)
    EndFunc


    Damit solltest du den Rest leicht hinbekommen - Stichwort: Städtearray.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • Hm da komm ich grad nicht ganz mit. Ich arbeite mit meinem String im kompletten Skript bereits in einer Funktion. Ich kann also nicht eine weitere Funktion innerhalb meiner Funktion aufrufen - oder steh ich da gerade auf dem Schlauch?

    Hatte mal probiert, die Funktion nach meiner eigentlichen Funktion aufzurufen aber irgendwie ruft er diese Funktion gar nicht ab...

    Im meiner Funktion, wo eigentlich fast alles im Skript verarbeitet wird, ist der komplette String in der Variable $sOutput17.

    Die Funktion selber rufe ich über einen GUIButton auf und dann rattert er halt meine sehr lange Funktion runter, bis er meinen gewünschten String in der oben genannten Variable hat. Nen Profi wird wahrscheinlich die Hände über den Kopf zusammen schlagen, wenn er meinen Quellcode sieht - aber er tut für mich genau das, was er soll - daher reicht mir das :D

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Ah... _StringProper - die Funktion kannste ich noch gar nicht. Alles klar... nach etwas Startschwierigkeiten hab ich einen Code schnipsel der mir nur den gewünschten Ortsnamen klein ändert. Wunderbar...
    vielen Dank für den Hinweis :)

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Die Funktion führt allerdings dazu das ALLE (!) Wortanfänge groß geschrieben werden. Nach deinem Post oben eigentlich nicht dein Ziel.

    Siehe:

    Meine Methode hat eben nur den Nachteil, dass du erst einmal alle benötigten Städte in ein Array bringst.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • ich denke man muss hier wieder mit StringRegExp arbeiten - aber das Ding ist mir einfach zu hoch

    ich bin sicher nicht der großartige RegEx`er, aber Großbuchstaben finden ist recht einfach

  • Doch _StringProper führt zum Ziel - wenn man es gezielt einsetzt :)

    Als Beispiel:

    AutoIt
    $origin_city_big = (StringRegExp($s_TextTemplate, "(?<=von)\s*\D{2}-\d*\s*([[:alpha:]]*)", 3))[0]
    $origin_city_small = StringRegExpReplace($s_TextTemplate, (StringRegExp($s_TextTemplate, "(?<=von)\s*\D{2}-\d*\s*([[:alpha:]]*)", 3))[0], _StringProper($origin_city_big))


    Ich will im Text ja wirklich nur die beiden Ortsnamen "ersetzt" haben (die ja jedesmal anders sind und wir vorher auch nicht wissen. Als Transportunternehmen wird es schwer das vor der Anfrage des Kunden schon zu wissen :) ). Andere eventuell gross geschriebene Sachen dürfen gern so bleiben. Daher habe ich den Ort extra per StringRegExp gesucht und anschliessend per _StringProper ersetzt. Macht genau das was es soll und ist weitaus kürzer als oben angegebene Vorschläge - wobei die mir sicher auchd en Weg nach Rom zeigen würden :):):)

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • @mirko:

    Wenn du bereits Ansprüche dieser Art stellst, solltest du _StringProper vermeiden. Die Funktion selbst ist deutlich länger als die oben genannte, die sich bequem auf zwei Zeilen ohne Leistungsverlust stauchen lässt, führt zu exakt dem selben Ziel nur ist dabei *deutlich* langsamer. Hier einige Testmessungen - über 100000 Versuche:

    SALZBURG

    P: Salzburg 0.0522118798000357
    L: Salzburg 0.00635305860000865

    FuLdA
    P: Fulda 0.0367447256999982
    L: Fulda 0.00645217520000883

    Frankfurt
    P: Frankfurt 0.0589764258999852
    L: Frankfurt 0.00650131850000692

    ....

    Ich glaube das Muster dürfte zu erkennen sein. Egal wie man ein einzelnes Wort schreibt: StringLower2 / Gross2 oder wie man die Funktion auch nennen mag ist immer schneller, einfach weil _StringProper nicht für einzelne Worter, sondern für komplette Sätze gemacht wurde, und daher auch einen RegEx verwendet.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.