theunreal
Goto Top

Regex in Powershell

Moin zusammen,

ich habe mal wieder eine Frage zu einem Phänomen, das ich nicht ganz verstehe.
Emailbody:
Vorname   Roland
Nachname   MüllerSchulze
....
Land   Deutschland



function CheckTextBody{
    # Wir prüfen, ob die Daten plausibel sind an   
    $CheckStrings = @("Nachname","Straße","Hausnummer","Wohnort","Land","PLZ","Emailadresse","Seriennummer")  

    try{
        if ($CheckedString -Match "((?s)(data:.*:data))" -eq $true){  
            Foreach ($part in $CheckStrings){
                $CheckedString -Match "(?<=$part)( +)(\w+)(\b)"                             
               .......

Ich mache eine Prüfung ob in einer Schnittstellen-Email alle Informationen für eine postalische Retoure vorhanden sind.
Das ganze läuft über eine einfache Regex-Abfrage "Nimm mal alles was hinter $part steht...."

Nun prüfe ich einen Punkt "Land" und erhalte dort zumeist "Deutschland", falls mal was anderes als Deutschland oder Österreich steht, löst eine Fehlermeldung eine Email aus, die dem Versender mitteilt, dass wir dieses Land nicht bedienen.

Lustig bei dem ganzen wird es, sobald unter "Vorname", der hier gar nicht abgefragt wird, der Kollege dann wie im Beispiel "Roland" heißt. Mein Script meldet stolz "Das Land MüllerSchulze gibt es nicht, bitte prüfen Sie die Daten!"

Ich wundere mich darüber, weil bei Land tatsächlich der Nachname OHNE "Nachname" steht, heißt, ich könnte es nachvollziehen wenn "Das Land Nachname MüllerSchulze...." da stehen würde.
Der OnlineRegex builder findet übrigens nur "Deutschland" bei Eingabe

Hoffe jemand hat da eine Idee für mich (oder eine Liste wie viele "land" Namen es gibt, dann prüf ich das einzeln^^)
Gruß
Sascha

Content-ID: 1121243691

Url: https://administrator.de/contentid/1121243691

Ausgedruckt am: 25.11.2024 um 10:11 Uhr

StefanKittel
StefanKittel 04.08.2021 um 14:15:46 Uhr
Goto Top
Hallo,
dann schreibe in der Mail doch Land: und suche danach. Oder nach \nLand
Sichere Trennzeichen sind immer hilfreich
Stefan

PS: Auch in Strasennamen kommte bestimmt häufig land vor.
TK1987
Lösung TK1987 04.08.2021 aktualisiert um 14:58:26 Uhr
Goto Top
Moin Sascha,

Zitat von @TheUnreal:
if ($CheckedString -Match "((?s)(data:.*:data))" -eq $true){  

was soll dieses "-eq true" bringen?
Match gibt bereits ein Wahrheitswert aus - dann noch mal zu prüfen ob $true -eq $true ist - vollkommen useless use.

$CheckedString -Match "(?<=$part)( +)(\w+)(\b)"  
Du solltest dir angewöhnen, nur Werte in Gruppen zu packen, die du auch wirklich benötigst.
Durch sowas wie "( +)" hast du nachher eine Gruppe mit lauter Leerzeichen, die dir nichts nutzt (mal davon abgesehen, dass du diese Leerzeichen auch noch in die Lookbehind-Assoziation hättest packen können).

Deine Daten stehen doch immer am Zeilenanfang, wieso suchst du dann nicht auch, ob die Zeichenkette am Zeilenanfang steht - so hast du auch keine Probleme mit Namen wie Roland.
$CheckedString -Match "(?m)(?<=^$part +)\w+\b"  

Gruß Thomas
TheUnreal
TheUnreal 04.08.2021 um 15:15:33 Uhr
Goto Top
Hallo und danke für eure Beteiligung,

@Stefan
Ich habe lange gebraucht um eine Standardmail zu erhalten, die ich überhaupt verarbeiten kann. DOrt nun nach einer Änderung zu fragen, würde ich mir gerne als letzte Option suchen^^

@thomas
was soll dieses "-eq true" bringen?

Es hat nichts mit der Match-Abfrage zu tun, sondern ist eine Überprüfung ob "data:" und ":data" in der Mail vorhanden sind.
Ich prüfe so, ob überhaupt Daten zur Verarbeitung in der Mail sind. Für aussenstehende dann eher unglücklich die Variablenbezeichnung CheckStrings (Für die Strings die geprüft werden sollen) und CheckedString für den vorher geprüften Text.

So habe ich vor einer Verarbeitung zumindest ein Indiz zum übergehen der Mail.

Danke für den Tipp, ich dachte ein Positive Lookbehind reicht mir...
In Anlehnung an mein Kommentar oben dann aber :
$CheckStrings -Match "(?m)(?<=^$part +)\w+\b"  

Jetzt ist erstmal Feierabend, ich prüfe das morgen früh und markiere es als gelöst.
Gruß Sascha
TK1987
TK1987 04.08.2021 um 15:27:47 Uhr
Goto Top
Zitat von @TheUnreal:
@thomas
was soll dieses "-eq true" bringen?

Es hat nichts mit der Match-Abfrage zu tun, sondern ist eine Überprüfung ob "data:" und ":data" in der Mail vorhanden sind.
Natürlich hat das damit zu tun... oder besser gesagt: Eben genau DAS ist ja gerade die Match-Abfrage!
Das "-eq $true" hat da nichts mehr verloren.
TheUnreal
TheUnreal 04.08.2021 um 16:32:13 Uhr
Goto Top
Ja, jetzt hats geklickt....Klar, wenns matched isses true, wenn nicht dann nicht^^
Überbleibsel des selflearning.

Danke für deine Geduld
TheUnreal
TheUnreal 09.08.2021 um 08:02:07 Uhr
Goto Top
Hi zusammen,

im Grunde selbsterklärend, der Code funktionier natürlich. Ich finde aber keine Information zum "m"? Welche Sonderfunktion hat es, bitte? Denn obwohl das Zirkumflex den Zeilenanfang markieren soll, funktioniert es nicht ohne das m.

Gruß Sascha
TK1987
TK1987 09.08.2021 aktualisiert um 09:25:58 Uhr
Goto Top
Zitat von @TheUnreal:
Ich finde aber keine Information zum "m"? Welche Sonderfunktion hat es, bitte? Denn obwohl das Zirkumflex den Zeilenanfang markieren soll, funktioniert es nicht ohne das m.
Regex Optionen

Gruß Thomas