osReplaceString ersetzt fehlerhaft

Kxirya Weytana
Kxirya Weytana
 Member edited June 9 in Create & Objects
Huhu zusammen,

Probiert mal folgendes Kommando aus:
osReplaceString("Dies.ist.ein.Text.", ".", "#", -1, 0)

Normalerweise sollte man denken, dass dadurch alle Punkte ":" durch "#" ersetzt werden, oder?
Komischerweise werden aber ALLE Zeichen durch "#" ersetzt.
Ist das so gewollt, weil z.B. der Punkt alle Wildcard genutzt werden kann?

Wenn ja, wie kann ich dann Punkte "." ersetzen?

Grüße

Comments

  • Kxirya Weytana
    Kxirya Weytana
     Member edited June 9
    Huii, das ging schneller, als ich dachte. Habs selber herausgefunden.

    Man muss nur zwei "\" vor den Punkt setzen, also "osReplaceString("Dies.ist.ein.Text.", "\\.", "#", -1, 0)" benutzen.

    Kann also geschlossen werden.

    Grüße.
    Thanked by: Pius Noel
  • Pius Noel
    Pius Noel
     Member
    Da muss man aber auch zuerst drauf kommen. 
  • Christoph Balhaus
    Christoph Balhaus
     Member edited June 10
    osReplaceString ersetzt mittels Regular Expressions im String. Das ist viel mächtiger als ein normales Replace, weil sich damit auch komplexe Muster finden und ersetzen lassen.

    Z.B. findet "[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}" als Suchmuster eine beliebige UUID die sich dann durch irgendwas anderes ersetzen lässt.

    /Chris



    Thanked by: Pius Noel
  • Kxirya Weytana
    Kxirya Weytana
     Member edited June 10
    Toll, das das so ist, nur wäre es äußerst sinnvoll und auch unglaublich hilfreich, würde man DIESE Information zumindest auf der Seite mit den OSSL Kommandos einmal andeuten, denn riechen kann man sowas ja nicht. XD

    Daher danke für diese überaus WICHTIGE Info!


  • Kxirya Weytana
    Kxirya Weytana
     Member
    Noch eine Frage dazu:

    Wenn ich z.B: eine UUID mit der o.g. Zeile ersetzen kann, wie negiere ich das? Ich will also z.B: aus einem String nur eine UUID herausfiltern.
    Normalerweise sollte das mit einen  "^" vor der gesamten Zeichenkette gehen, oder?
    Das aber klappt bei mir nicht (weil ich für die RegEx Konventionen echt zu dämlich bin XD)


    LG

    Grüße.
  • Christoph Balhaus
    Christoph Balhaus
     Member edited June 12
    Wenn du Strings erkennen und herausfischen willst bräuchtest du einen Matcher oder eine find Funktion. Die würden dir dann als Ergebnis eine Liste mit den konkreten UUIDs liefern die im Quellstring erkannt worden.

    Leider scheint das nur halb implementiert zu sein und genau das fehlt - zumindest nach der Doku. Es gibt zwar eine Funktion osMatchString() die das tun sollte, aber genau die arbeitet - wenn die Doku richtig ist denn benutzt habe ich sie noch nicht - unverständlicherweise nicht mit Regular Expressions.

    Ich habe es gerade mal ausprobiert und muss mich korrigieren. osMatchString() verwendet Regular Expressions und tut genau das was du brauchst:

            list l;
            l = osMatchString(src,"[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}",0);
            llSay(0, llDumpList2String(l," "));

    liefert dann die in einem String enthaltenen UUIDs.

    Das Zeichen "^" am Anfang einer RegEx ist ein Anker. Ein Match tritt dann nur auf, wenn die Zeilenkette ganz am Anfang des Strings gefunden wird. Entsprechend "$" für das Ende am Ende des Ausdrucks.

    /Chris

    Noch ein Nachtrag:
    Das Finden passender Regular Expressions ist - für mich zumindest - häufig mit ein wenig Trial-and-Error Debugging verbunden. Online Seiten wie https://regex101.com/ sind extrem hilfreich um die richtigen Ausdrücke zu finden ohne viel coden zu müssen.
  • Kxirya Weytana
    Kxirya Weytana
     Member
    Stimmt! Das "^" hatte ich falsch im Kopf. Lach
    Wie ich sagte, RegEx ist ein Ding, da muss ich entweder immer lange tüfteln oder ich frage jemanden, der das begriffen hat.

    Grüße.
Sign In or Register to comment.

Welcome

It looks like you're new here. If you want to get involved, click one of these buttons!

Discussions

© Copyright 2018 - Metropolis Metaversum
All times are GMT