Suchen und Ersetzen von bestimmten Ausdrücken im String

  • Hallo an alle!
    Ich beschäftige mich erst seit wenigen Tagen mit LotusScript und suche einen Weg, wie ich bestimmte Ausdrücke in einem String ersetzen kann.


    In Notes habe ich für meine Applikation eine E-Mailvorlage erstellt. Der Body sieht so aus:

    Code
    "Hallo <<wfantragssteller>>,Dein Urlaub vom <<ersterTag>> bis zum <<letzterTag>> wurde genehmigt."


    Mein Problem
    Das Versenden der E-Mail ist ein automatischer Prozess, welcher bisher 1A funktioniert.
    Jetzt brauche ich eine Möglichkeit wie ich den String (siehe oben) durchsuchen kann "<<" und ">>" sollen als Marker funktionieren und der Ausdruck dazwischen soll als Eigenschaft rausgelesen werden.


    Sprich, aus "Hallo <<wfantragssteller>>" wird --> "Hallo" & nd.wfantragssteller


    Diese Bearbeitung müsste mE nach "SourceBody = rtItem.getUnformattedText" stattfinden?!




    ich hoffe Ihr versteht mich :P


    Vielen Dank

  • Wenn du dich mit LotusScript "beschäftigst", nehme ich an, du hast dir in aller Gewissenhaftigkeit die Hilfe zu Gemüte geführt, bzw. bist in der Lage und Willens, das zu tun.
    Weiters nehme ich an, dass du zwei so simple Begriffe wie "replace" und "substring" in das Suchfeld eingeben kannst.


    Sollten diese Annahmen zutreffen, verstehe ich deine Frage nicht.

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • richtig .. .darüber bin ich auch schon gestolpert, aber noch nicht schlau draus geworden...
    Alles was ich mit Replace und Substring gelesen habe schien nach meiner Überlegung nicht zu funktionieren...


    Durchsuche den Text - Schreibe alles raus, was mit "<<" anfängt und hör bei ">>" auf...
    Das was rausgeschrieben wurde an nd. anhängen...


    edit--------


    Ok... Findreplace war dann am Ende mit einer eigenen Function gelöst...


    Code
    Function Findreplace(ByVal wholestring As Variant, find As String, ireplace As String) As String            Dim checkstring As String            Dim saveleft As String            Dim n As Variant            Dim leftstring As String            Dim rightstring As String                        checkstring=wholestring                        saveleft=""                        While InStr(1, checkstring, find)<>0                        n=InStr(1, checkstring, find)                        leftstring = Left(checkstring, n-1)                        rightstring=Right(checkstring, Len(checkstring)-n-Len(find)+1)                            saveleft=saveleft+leftstring+ireplace                            checkstring=rightstring                        Wend    FindReplace= saveleft+checkstringEnd Function


    Code
    ...    If Not (ndTemplate Is Nothing) Then                        Set rtItem = ndTemplate.Getfirstitem("Body")                                Set ndMail = nd.Parentdatabase.Createdocument()                    ndMail.subject = "Urlaub genehmigt"                    ndMail.SendTo = "Alexander Stein"                    ndMail.form = "Memo"                    SourceBody = rtItem.getUnformattedText                     SourceBody = Findreplace(SourceBody, "<<", "nd.")                     SourceBody = Findreplace(SourceBody, ">>", "(0)")    Call ndMail.Replaceitemvalue("Body",SourceBody)    Call ndMail.send(True)


    Jetzt habe ich in der E-Mail nur das Problem, dass es als String gesetzt wird und nicht den entsprechenden Wert aus dem Dokument zurückliefert. Ist es Möglich genau diesen Teil eben nicht als String auszugeben?!

    Code
    "Hallo <<wfantragssteller>>," -> "Hallo nd.wfantragssteller(0), "
  • @Ronka
    wenn sich der Name mal ändern sollte, ist das wieder hinfällig. Zudem müsste ich jede Möglichkeit separat angeben...


    @umeli Ich werde es mir mal anschauen übers WE.


    Mir kam noch eine Idee den Text drumherum auszuschneiden und dann via GetItemValue den Wert zu bekommen...

  • sulley: Wenn du NUR den TEXT nd.wfantragssteller(0) in dein Text haben möchtest, und nicht den INHALT vom nd.wfantragssteller(0) dann solltest du den routine so lassen wie du es gemacht hast. Wenn du den INHALT dieses Feldes in dein Text haben möchtest, dann kannst du das NUR auf diesen weg machen.
    Und ja, du kannst dabei NUR die werten anpassen die du selber kennst oder du mußtest deine routine zuerst alle texte suchen lassen, danach kontrollieren ob den gefundene werten auch als feld existieren (mittels nd.hasitem( feldname) zu suchen), und dann es zu ersetzen mit den vorher gegebene findreplace-
    Natürlich kannst du das Flexibeler machen, aber dafür brauchst du LOGIC, die kannst du z.B. bauen durch den text innerhalb der Klammern in einen Variabele zu verwandeln, und dann kannst du beide als variabelen verwenden.
    also einen routine die aus den Variabelen einen Text mit klammern macht und dazu den wert aus den nd.fieldgettext( variabele ) holt.


    Grundsätzliche geht es aber NUR auf den weg der ich dir gezeigt habe, und so verwende ich FX (Field Exchange) schon seit fast 25 JAHREN. und das geht problemlos, wenn mann halt die grundbegriffen verstanden hat.

  • Hallo,


    ich hatte mal so eine ähnliche Problemstellung. Ich musste aus einem Textfeld gewisse Informationen auslesen, welche zwischen klar definierten Textbegrenzungszeichen (Mustern) standen. Im Netz habe ich dann eine Lösung mit Hilfe von regulären Ausdrücken gefunden, die für meinen Fall sehr gut ging.
    Vielleicht hilft dir das auch weiter. Hier der Code Ausschnitt, welcher für die Suche relevant ist.



    Grüße
    Oliver

    Grüße aus dem sonnigen Süden
    Oliver C


    Es gibt keine dummen Fragen, sondern nur dumme Antworten


    Laufen ist der ideale Ausgleich zu jeglicher Arbeit, denn beim Laufen tut man eigentlich nichts.

  • Die VBScript-Lösung wird dann naturgemäß nur auf Windows-Rechnern laufen, bei MacOS und Linux fällt das Konstrukt auf die Nase.
    Die Frage ist, ob man nicht entweder Rudis Lösung hernimmt, oder ob man mit dem 'Like'-Operator nicht auch zum Ziel kommt...

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

    • Offizieller Beitrag

    bei der Verwendung von FindAndReplace aus der Klasse NotesRichTextRange bleiben die Testformatierungen (z.B. Schriftart, Farbe, Größe,...) erhalten.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Danke für die Hilfe! Ich habe jetzt einen funktionierenden Code,...



    Ronka: die E-Mailvorlage erstelle ich ja in Notes. Dort stehen mir dann die einzelnen Variablen des ausgewählten Formulars meines Programms zur Verfügung. Dh ich kann sicher sein, dass das ausgeschnittene Wort sicher eine Property von nd. ist.


    Im nächsten Schritt muss ich mal schauen, ob ich Datumswerte von der Uhrzeit befreien kann :P

  • funktioniert das auch mit Strings?
    Ich kriege das Datum ja aus dem Item, was in "sValue" gespeichert wird


    Code
    ... sValue = nd.GetItemValue( lString )(0)' Wenn das Item ein Datumswert enthält, ist es wie folgt abgespeichert: "dd.mm.yyyy HH:MM:SS"...


    direkt danach prüfe ich zZ ob der Wert diesem bestimmten Muster entspricht und schneide einfach die Uhrzeit ab...


    Code
    If (sValue) Like "##.##.#### ##:##:##"  Then
                                sValue = LeftBack (sValue, " ")
                            End If
  • hm... liegt halt an dem Programm :P ist ne Webanwendung mit XPages... mithilfe von Formularen können die Werte als Items eines NotesDocument gespeichert werden. Warum / Wieso das an dieser Stelle so gelöst wurde kann ich nicht sagen...