FbmRegExReplace funktioniert nicht wie erwartet

  • Hallo,


    das Beispiel


    Code
    1. FbmRegExReplace('1324152463451536', '([12]+)', 'X');


    liefert nicht wie erwartet 'X3X4X5X46345X536' zurück sondern 'X'. Gleiches gilt für andere Reguläre Ausdrücke. Ist dies ein Bug oder mache ich etwas falsch? Ich verwende Build 1274.

  • Hallo,


    da liegst du vollkommen richtig. Allerdings dauert es natürlich immer etwas, bis solche Fehlerbehebungen dann im Live-System ankommen.


    Das Problem hängt übrigens damit zusammen, dass immer nur der erste Match ersetzt wird. Durch eine kleine Erweiterung des RegEx kann man das Problem also meist umschiffen.

  • Hallo,


    ich habe schon wieder ein Problem mit der Funktion FbmRegExReplace.


    Code
    1. //search for email adress in email text and save in var
    2. sEjEmail := FbmRegExReplace(Item.TextViewData, '([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,})', '$1');


    Der reguläre Ausdruck funktioniert laut dem Regex Editor wie gewollt .
    Das Problem ist aber, dass in die Variable sEjEmail der komplette emailText geschrieben wird und eben nicht nur die gematchte email Adresse.


    Build 1326

  • Hallo,


    das liegt daran, dass FbmRegExReplace eine Ersetzung durchführt. Bei der Ersetzung einer Zeichenkette, durch eine andere mit ganz normalen String-Replace Funktionen, sieht das ja auch so aus:


    Code
    1. Str := 'Hallo Welt!';
    2. Str := AnsiReplaceStr(Str, 'Welt', 'GREYHOUND');
    3. Write(Str); // "Hallo GREYHOUND!"


    Um das gewünschte Ergebnis zu erreichen, kann man aber den Ausdruck wie folgt verändern:


    Code
    1. sEjEmail := FbmRegExReplace(Item.TextViewData, '.*(([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,})).*', '$2');


    Ab der GREYHOUND Version build 1350 gibt es übrigens auch die Funktion FbmRegExExtract welche für das gewünschte Verhalten (Zeichenkette per RegEx extrahieren) gedacht ist. Hier kann auch ein Fallback angegeben werden, wenn die Zeichenkette nicht gefunden werden kann.

  • Ab der GREYHOUND Version build 1350 gibt es übrigens auch die Funktion FbmRegExExtract welche für das gewünschte Verhalten (Zeichenkette per RegEx extrahieren) gedacht ist. Hier kann auch ein Fallback angegeben werden, wenn die Zeichenkette nicht gefunden werden kann.

    In der verlinkten Doku steht im Quelltextbeispiel allerdings FbmRegExReplace statt FbmRegExExtract. Der Rest stimmt aber. ;)