• Trim, SubString etc.: reguläre Ausdrücke für Zeichenoperationen nutzen

    Vor kurzem hatte ich ein Problem bei einem Nintex Workflow. Es ging darum, einen Text aus einer Variable von Leerzeichen vor dem Text und danach zu befreien (TRIM).
    Dafür ist der „Build dynamic string“ nicht gedacht. Hier können Texte dynamisch aus Variablen und/oder statischen Texten zusammengesetzt werden.
    Was nun?
    Hier kann natürlich die Aktivität „Regular Expression“ helfen. Die Lösung ich recht einfach, wenn man sich bereits mit regulären Ausdrücken auskennt.
    ^(?:\s*)([\W\w]*)(?:\b\s*$)
    Für das Bauen von regulären Ausdrücken verwende ich sehr gerne das Tool RegExBuddy. Das Tool erzeugt auch automatisch eine Erklärung für den Ausdruck (siehe unten [1]).

    Was uns jetzt interessiert, ist die erste s.g. Backreference (Durch (?:xxx) können Ausdrücke zu einer Gruppe zusammengefasst werden ohne in der  Backreference-Liste aufzutauchen). Das können wir leider nicht so in der Nintex Aktivität angeben. Was uns hier hilft, ist Split Operation. Diese nutzt die Backreference, um den Text zu zerstückeln.
    Wieso hilft uns hier die Extract Operation nicht? Diese findet den gesamten Match und nicht nur die Backreference :- ( Damit ist die Extract Operationan dieser Stelle nutzlos.

    Fazit: Wie konfiguriert man die Aktivität?

    (1) Zuerst den Typ „Split“ festlegen, sonst werden alle Felder gelöscht! Die Einstellung ist leider nicht als erste da. Nicht besonders logisch :-(
    (2) Pattern: ^(?:\s*)([\W\w]*)(?:\b\s*$)
    (3) Input Text: eine String Workflow Variable auswählen
    (4) Die Ergebnisse werden in einer Collection abgelegt. Diese muss man vorher als eine Workflow Variable hinzufügen

    Es kann sein, das wir keinen Treffer haben, dann ist unsere Collection leer (Input-Variable war leer). Das würde eine RunTime-Exception hervorrufen. Deswegen brauchen wir noch zusätzliche

    Aktivitäten:
    (1) Collection Operation – die Anzahl der Elemente in der Collection wird ausgelesen und in einer Workflow-Variable vom Typ Number countCollection abgelegt.
    (2) Run If – wenn countCollection größer als 0 ist, dann können wir den Text auslesen.
    (3) Set Variable – wir setzen den Index für die Get-Operation auf 1. Split-Operation liefert 3 Elemente: vor der Backreference, die Backreference, alles nach der Backreference.
    (4) Collection operation – die Variable mit dem Text nach dem Trim auslesen. Es ist das zweite Element in der Collection. Der Index beginnt bei 0. Deswegen haben wir in (3) den Index auf 1 gesetzt.

    Das Ganze sollte man dann in eine Action Box verpacken.
    Nach demselben Muster können folgende Operationen ausgeführt werden:

    trim: ^(?:\s*)([\W\w]*)(?:\b\s*$) - rechts und links Leerzeichen abschneiden
    rtrim: ^([\W\w]*)(?:\b\s*$) - nur rechts Leerzeichen abschneiden
    ltrim: ^(?:\s*)([\W\w]*) – nur links Leerzeichen abschneiden
    substr :position, length : ^(?:[\W\w]{x})([\W\w]{y}) – einen Substring ausschneiden, ab der Position x und mit der Länge y

    Andere Operationen:

    concat – Textzeichen zusammensetzen: dafür ist Build dynamic String prädestiniert
    replace – Reguar Expression replace und für den Treffer $1 etc. nutzen
    Leider ist es nicht möglich mit RegEx und Nintex folgende Operationen durchzuführen. Vielleicht aber doch? Ideen?
    upper: ^([\W\w]*) \U1 -> Spirit Link Technology – SPIRIT LINK TECHNOLOGY
    lower ^([\W\w]*) \L -> Spirit Link Technology – spirit link technology
    initcap (\w)(\w+) \F1$2 -> spirit link technology - Spirit Link Technology
    rpad DOG-*-*-*, beginning, ending, padding
    lpad *-*-*DOG

    Mit der Match-Operation, die ein Yes/No zurückliefert, können Beispielweise folgende Werte validiert werden (hier kann auch „Set a Condition“ oder „Run If“ benutzt werden, dass ebenfalls reguläre Ausdrücke unterstützt):
    - Nur Buchstaben
    - Nur Zahlen
    - Alphanumerisch
    - gültige IP Adresse
    - gültige eMail Adresse
    - etc.

    Viel Spaß damit! Weitere Ideen?

    TIPP 1:
    Dem regulären Ausdruck können auch Parameter als „inline parameter“ übergeben werden.
    Um z.B. in einem Text wie „Spirit Link Technology“ nach dem Wort „Link“ zu suchen, könnten wir die Match-Operation benutzen:
    Pattern: link
    Allerdings wird hier case-senstive gesucht und wir bekommen keinen Treffer. Mit den „inline parameter“ i können wir das Verhalten ändern
    Pattern: (?i)link
    Mehr zum Thema RegEx und Parameter:
    http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx

    TIPP 2:
    Benutzen Sie als String Unicode, so müssen andere Operatoren für die regulären Ausdrücke benutzt werden. Es gilt nicht bei UTF 8 für die englische und deutsche Sprache.
    \p{name}
    Matches any character in the Unicode general category or named block specified by name (for example, Ll, Nd, Z, IsGreek, and IsBoxDrawing).
    http://msdn.microsoft.com/en-us/library/20bw873z.aspx

    Erklärung:

    [1] Trim RegExp ^(?:\s*)([\W\w]*)(?:\b\s*$)
    Assert position at the start of the string «^»
    Match the regular expression below «(?:\s*)»
    Match a character that is a “whitespace character” (spaces, tabs, line breaks, etc.) «\s*»
    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
    Match the regular expression below and capture its match into backreference number 1 «([\W\w]*)»
    Match a single character out of the list: non-word character, or a word character «[\W\w]*»
    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
    Match the regular expression below «(?:\b\s*$)»
    Assert position at a word boundary «\b»
    Match a character that is a “whitespace character” (spaces, tabs, line breaks, etc.) «\s*»
    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
    Assert position at the end of the string (or before the line break at the end of the string, if any) «$»

Keine Kommentare

Ihr Kommentar



Bitte füllen Sie die benötigten Felder aus.