Überprüfen ob String gültig ist

  • Hi, habe seit Jahren nichts mehr gemacht, bin total eingerostet.

    Ich sitze vor einen Problem, ich möchte überprüfen ob ein String für meine Zwecke gültig ist.

    Ein für mich gültiger String schaut zb so aus "AU1" =>Nur großbuchstaben und ggf Ziffern vorhanden.

    Dies wird wohl nur über StringRegExp funktionieren? Wenn ja, da steige ich nicht durch, ist mir seit Jahren ein Buch mit 7 Siegeln :(

    Weil vorhandene Funktionen nicht gehen, zb StringIsUpper (Weil halt ggf eine Ziffer dabei steht)

    Hat da jemand eine Idee?

    Vielen Dank

  • Hi, das mit RegExp gilt für mich genauso. Aber wenn es nur Grußbuchstaben und Zahlen sein drürfen kannst du das durchaus ohne RegExp realisieren.
    Dann wird halt nur der Code etwas länger. zB so

    [autoit]

    $string = "AHHFHS6"

    [/autoit][autoit][/autoit][autoit]

    If _gueltigerString($string) Then
    MsgBox(0,"Okay!","Der String ist gültig. xD")
    Else
    MsgBox(0,"Fehler!","Der String ist leider ungültig. :(")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Func _gueltigerString($this)
    Local $string = StringSplit($this, ""), $return = False
    If IsArray($string) Then
    For $i = 1 To $string[0]
    If StringIsInt($string[$i]) Or StringIsUpper($string[$i]) Then
    $return = True
    Else
    $return = False
    ExitLoop
    EndIf
    Next
    EndIf
    Return $return
    EndFunc

    [/autoit]


    Das ganze lässt sich auch noch auf die Länge des zu prüfenden Strings festlegen, wenn es nur 3 Zeichen lang sein soll.

  • @4ern
    Dein Pattern prüft nur ob Zahlen oder Buchstaben im String vorhanden sind - nicht ob er ausschließlich aus ihnen besteht.
    Wäre der String z.B. '!AHH{FHS6?' würde trotzdem positiv gematcht.

    Die Überprüfung auf den ganzen String könnte man hingegen so realisieren:

    [autoit]

    StringRegExp('AHHFHS6', '^[\dA-Z]*$')

    [/autoit]
  • Vielen lieben Dank erstmal für die Hilfe.

    In der Zeile sehe ich ein Problem
    If StringIsInt($string[$i]) Or StringIsUpper($string[$i]) Then

    Da wird Überprüft ob der String Großbuchstaben, oder Zahlen enthält. Ein PR Code hat immer 3 Werte zb "0A0" . Bei Der Abfrage würden nur Einträge "freigegeben" die AAA oder 111 sind, beider vermischt, wäre ungültig.

    Das ist aber mein Fehler. Ich hole mal etwas weiter aus. Und Zwar hat man die Möglichkeit über Elsa-online für sein PKW die PR Codes zu kopieren.

    Diese PR Codes möchte ich sauber in eine txt Datei schreiben lassen, für jeden Code eine neue Zeile.


    Die Ausgangsdatei habe ich mal angeheftet.

    Die ersten Ziffern ist die laufende Nummer, und der 2te Block der eigentliche PR Code

    Daher mein Script (Ist echt nicht so gut, wahrscheinlich extrem verkompliziert)

    [autoit]

    #include <FileConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <Array.au3>
    ; Create a constant variable in Local scope of the message to display in FileOpenDialog.
    Local Const $sMessage = "Select a single file of any type."

    [/autoit][autoit][/autoit][autoit]

    ; Display an open dialog to select a file.
    Local $sFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "TXT (*.txt*)", $FD_FILEMUSTEXIST)

    [/autoit][autoit][/autoit][autoit]

    Functionsaufruf()

    [/autoit][autoit][/autoit][autoit]

    Func Functionsaufruf()
    ; Read the current script file into an array using the filepath.
    Local $aArray = FileReadToArray($sFileOpenDialog)
    If @error Then
    MsgBox($MB_SYSTEMMODAL, "", "There was an error reading the file. @error: " & @error) ; An error occurred reading the current script file.

    [/autoit][autoit][/autoit][autoit]

    Else

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To UBound($aArray) - 1 ; Loop through the array.
    $trim=$aArray[$i]
    $gesamt=StringLen($trim)
    $abfrage=StringTrimRight($trim,$gesamt-3)

    [/autoit][autoit][/autoit][autoit]

    if $abfrage <10 Then $trimleft=StringTrimLeft($trim,2)
    if $abfrage < 100 and $abfrage >10 Then $trimleft=StringTrimLeft($trim,3)
    if $abfrage > 100 then $trimleft=StringTrimLeft($trim,4)
    $gesamt=StringLen($trimleft)
    $trimende=StringTrimRight($trimleft,$gesamt-3)
    if StringRegExp($trimende, '(^[A-Z]*\d*|\d*[A-Z]*)') then FileWriteLine("PR-sauber.txt",$trimende&@CRLF)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Next
    EndIf

    [/autoit][autoit][/autoit][autoit][/autoit]

    Mit StringRegExp funktioniert es nur bedingt.

    Es werden dennoch Kleinbuchstaben mit ausgegeben, daher sind die ersten Zeilen kein PR Code.

    Sollte mit den RegExp mal versuchen irgendwie mich da einzuarbeiten, wenn man es kann, ist ist sehr "mächtig"

    Edit:
    Danke @ AspirinJunkie, damit kommt das gewünschte heraus!

    Einmal editiert, zuletzt von devildevil3 (12. März 2015 um 10:04)

  • Ohne RegEx wird es wirklich verdammt schwer.
    Es lohnt sich wirklich sich eingehender damit zu beschäftigen.
    >>Hier<< gibt es ein gutes RegEx-Tutorial für AutoIt.

    Deine Aufgabe mit regulären Ausdrücken umgesetzt:

    [autoit]

    ; Datei zum schreiben öffnen
    $h_FileOut = FileOpen("PR-sauber.txt", 2)

    [/autoit][autoit][/autoit][autoit]

    For $PR in StringRegExp(FileRead("PR-Coding.txt"), "(?m)^\d+\s([\dA-Z]{3})*", 3)
    FileWriteLine($h_FileOut, $PR)
    Next

    [/autoit][autoit][/autoit][autoit]

    FileClose($h_FileOut)

    [/autoit]
  • @AsperinJunkie, das wäre eine enorme Verkürzung der Aufgabe. Aber wie vermeidest du das zb diese Zeile

    "113 8IT P HSW LED- Hauptscheinwerfer" falsch ausgewertet wird.

    113 ist die laufende Nummer, 8IT der PR Code, P Herkunft und HSW die Familie.

    Aber HSW wäre doch auch gültig, da Großbuchstaben und 3 von der Zahl?


    Ich werde versuchen das TUT mal zu verstehen, schaut auf ersten Blick wirklich gut erklärt aus.

  • Das ist ja das schöne an regulären Ausdrücken - du kannst sehr detailliert den Stringaufbau beschreiben.
    In deinem Beispiel wird das HSW durch das Pattern nicht gematcht, da es an der falschen Stelle steht.

    Ich erkläre das Pattern mal schrittweise:

    • (?m) - Eine Option welche dafür sorgt, dass ^ von nun an für den Zeilenanfang steht (standardmäßig ist es der Stringanfang)
    • ^ - Ein Zeilenanfang
    • \d+ - gefolgt von mindestens einer Zahl (das + bedeutet mindestens 1)
    • \s - gefolgt von einem Whitespace-Zeichen (z.B. ein Leerzeichen)
    • (..) - alles was in der Klammer steht wird als Ergebnis zurückgegeben
    • [...] - alles was in der eckigen Klammer stellt einen Pool an möglichen Zeichen dar, aus dem die Stelle bestehen kann
    • \d - hier also entweder aus einer Zahl ...
    • A-Z - oder den Großbuchstaben A-Z
    • {3} - das ganze muss drei mal vorkommen (dein PR-Code besteht ja immer aus exalt drei Zeichen)
    • * - das Sternchen ist falsch und ist irgendwie nur versehentlich reingerutscht. - Nimm es raus und ersetze es durch ein \s. Das führt dazu, dass hinter der PR-Nummer ein Leerzeichen kommen muss.

    Dein "HSW" wird also deshalb nicht gematcht, da direkt vor ihm kein Leerzeichen, eine Zahl und der Zeilenfang steht.

    • Offizieller Beitrag

    Ich bevorzuge zwar auch die RegExp-Variante, habe trotzdem mal probiert, wie das ohne RegExp umsetzbar ist.
    Eigentlich gar nicht so aufwändig. Statt der Konsolenausgabe kann man dann die Ergebnisse sammeln und in einem Rutsch am Ende in eine Datei schreiben.

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    $path = "C:\Pfad\PR-Coding.txt"

    [/autoit] [autoit][/autoit] [autoit]

    Local $aFile
    _FileReadToArray($path, $aFile)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aFile[0]
    $s1 = StringLeft($aFile[$i], 1)
    If Not StringIsDigit($s1) Then ContinueLoop
    $aLine = StringSplit($aFile[$i], ' ')
    If $aLine[0] < 2 Then ContinueLoop
    If StringIsDigit($aLine[1]) And StringLen($aLine[2]) = 3 Then
    $aSplit = StringSplit($aLine[2], '')
    $fMatch = True
    For $j = 1 To 3
    If Not (StringIsDigit($aSplit[$j]) Or StringIsUpper($aSplit[$j])) Then
    $fMatch = False
    ExitLoop
    EndIf
    Next
    If $fMatch Then ConsoleWrite("PR: " & $aLine[2] & @CRLF)
    EndIf
    Next

    [/autoit]