RegExp Frage bezüglich Zeichen

  • Hi,

    kurze Frage:
    Ich möchte im folgenden "^°!'das.cmd|" aus dem String entfernen, weiß aber nicht, wie ich angeben kann das ALLE Zeichen entfernt werden sollen!

    [autoit]

    Local $s_r = "abriss.exe|^°!'das.cmd|meister.txt|"
    MsgBox(64, "", StringRegExpReplace($s_r, "(?i)[[:alnum:]]+.(cmd)\|", ""))

    [/autoit]

    4 Mal editiert, zuletzt von teh_hahn (20. Februar 2008 um 22:13)

  • Ach ja,
    da hätte ich wohl die Frage etwas genauer stellen sollen. Der Dateiname, kann natürlich auch anders sein, z.B. SuperTyp.cmd oder 123458ichkannnedzählen.cmd oder, oder, oder. Also sämtliche Zeichen! Ich weiß bloß nicht, wie man das ausdrückt in RegExp! interessant ist eigentlich nur:

    Code
    [[:alnum:]]


    Dafür brauche ich einen Ausdruck, der alle Zeichen (bzw. alle Zeichen, die ein Dateiname haben kann - die wollte ich nicht alle rausfriemeln, da es bestimmt einfacher geht) entfernt!

  • Hi!

    Danke schon einmal. Aber das klappt noch nicht ganz (bin leider nicht sehr bewandert mit RegExp!):

    [autoit]

    Local $s_r = "abriss.exe|^°!'das.cmd|meister.txt|sdadsa.cmd|dsasdas.txt|dsadsa.cmd|"
    MsgBox(64, "", StringRegExpReplace($s_r, "(?<=\|).*?.cmd\|", ""))

    [/autoit]
  • He, he. Ich wollte mir mal bei Gelegenheit ein Tutorial dazu durchlesen! Kannst Du mir da vielleicht eines empfehlen (Hilfe ist da ja doch etwas dünn!)?

    Auf jeden Fall vielen Dank für das Pattern!
    So, auf ins Wochenende!

    EDIT: Muss aber case-insensitive sein, also:

    [autoit]

    StringRegExpReplace($s_r, "(?i)\|[^\|]*\.cmd", "")

    [/autoit]
  • Hi,
    erstmal danke Xeno!
    das Pattern passte doch noch nicht ganz! Und zwar wurde nicht erkannt, wenn die erste Datei vor dem "|" eine *.cmd war.
    Die Änderung auf:

    [autoit]

    StringRegExpReplace($s_r, "(?i)[^\|]*\.cmd\|", "")

    [/autoit]


    brachte dann jedoch das gewünschte Ergebnis!

    Nun würde ich aber auch gerne mehrere Dateiendungen filtern. Das geht ja z.B. mit:

    [autoit]

    StringRegExpReplace($s_r, "(?i)[^\|]*\.cmd\||[^\|]*\.bak\|", "")

    [/autoit]


    Lässt sich das vielleicht auch noch vereinfachen? Irgendwie mit "cmd|bak" oder Ähnlichem?

    Außerdem wüsste ich gerne, ob sich das ganze auch negieren lässt. Soll heißen ich möchte NUR die Dateien zurück erhalten, die eine *.exe oder *.bak sind!
    Hier nochmal das Beispiel:

    [autoit]

    $s_r = "FileList.cmd|FileList.bak|TestApp.CMD|list.txt|Virus.exe|backup.CMD|"
    MsgBox(64, "", StringRegExpReplace($s_r, "(?i)[^\|]*\.cmd\|", ""))
    MsgBox(64, "", StringRegExpReplace($s_r, "(?i)[^\|]*\.cmd\||[^\|]*\.bak\|", ""))

    [/autoit]
  • Hi,

    ich bin grade dabei mir eine FileSearch-Funktion zu bauen (Ja, ich weiß davon gibt es so viele wie Sand am Meer, aber trotzdem!). Und für das Filtern nach Dateiendungen benötige ich dies (geht wesentlich schneller als alles andere!). Bin auch ansonsten so gut wie fertig.

    Ich weiß, dass man ^ zum negieren verwenden kann, aber wie wende ich das in diesem Fall auf die Extensions an?! Achso, dass ich mehrere rausfiltere, habe ich bereits hinbekommen, aber nun will google mir nicht helfen ^^:

    [autoit]

    $s_r = "FileList.cmd|FileList.bak|TestApp.CMD|list.txt|Virus.exe|backup.CMD|"
    MsgBox(64, "", StringRegExpReplace($s_r, "(?i)[^\|]*\.(cmd|exe)\|", ""))

    [/autoit]


    Ist doch die einfachste Methode, oder?
    Also nun nur noch die Möglichkeit, dass NUR die CMD- und EXE-Dateien zurück gegeben werden und ich bin glücklich!

    Wenn die Funktion fertig ist, werde ich sie hier selbstverständlich posten!

  • Ja, fast. Ich möchte das ganze aber nicht als Array zurück bekommen. Geht es denn nicht einfacher so wie beim exkludieren? Sonst hat man ja bei z.B. fünf filtern einen extrem langen String. Irgendwie versteh ich das Pattern auch nicht (Ist doch zweimal das gleiche, bloß einmal mit "|" vorne dran und einmal ohne! Ich hatte an so etwas gedacht:

    [autoit]

    #include <Array.au3>
    $s_r = "FileList.cmd|FileList.bak|TestApp.CMD|list.txt|Virus.exe|backup.CMD|listold.txt|blablubb.bak|"
    MsgBox(64, "Exclude", StringRegExpReplace($s_r, "(?i)[^\|]*\.(cmd|exe)\|", ""))
    MsgBox(64, "Include", StringRegExpReplace($s_r, "(?i)[^\|]*\.(^cmd|^exe)\|", ""))
    _ArrayDisplay(StringRegExp($s_r, "(?i)[^\|]*\.cmd|[^\|]*\.exe", 3)) ;~ Das funktioniert zwar, finde ich aber unschön!!!

    [/autoit]


    Ich weiß aber nicht, wie man das korrekt ausdrückt! oder ist da eine Lösung mittels Replace nicht möglich? Ansonsten bleibt nur der Weg über das Array!

    EDIT: Siehe Quelltext!

    Einmal editiert, zuletzt von teh_hahn (18. Februar 2008 um 14:33)

    • Offizieller Beitrag

    Hi,

    aha ... :D

    [autoit]

    #include <Array.au3>
    $s_r = "FileList.cmd|FileList.bak|TestApp.CMD|list.txt|Virus.exe|backup.CMD|listold.txt|blablubb.bak|"
    MsgBox(64, "Exclude", StringRegExpReplace($s_r, "(?i)[^\|]*\.(cmd|exe)\|", ""))
    MsgBox(64, "Include", StringRegExpReplace($s_r, "(?i)[^\|]*\.*[^cmd|bak]\|", ""))

    [/autoit]

    Edit: Wird aber auch nicht passen, da die Zeichen in der class einzeln ausgewertet werden. :thumbdown:

    Mega

  • //Edit: Selbst gemerkt :)

    Nö, dann gehen auch z.B. BMD oder CAK:

    [autoit]

    #include <Array.au3>
    $s_r = "FileList.cmd|FileList.bak|TestApp.CMD|list.txt|Virus.exe|backup.CMD|listold.txt|blablubb.bak|NO-->.BMD"
    MsgBox(64, "Exclude", StringRegExpReplace($s_r, "(?i)[^\|]*\.(cmd|exe)\|", ""))
    MsgBox(64, "Include", StringRegExpReplace($s_r, "(?i)[^\|]*\.*[^cmd|bak]\|", ""))

    [/autoit]
  • Mhh, ja das funktioniert leider wirklich nicht. Ich muss genau auf cmd ODER bak testen. Kann man das nicht irgendwie ganz einfach negieren? einfach ne Klammer drum und ^ oder so? ^^
    Wieso kann man da denn nicht mit Groups arbeiten, wie beim exkludieren?

  • Dann machs unschön:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $s_r = "FileList.cmd|FileList.bak|TestApp.CMD|list.txt|Virus.exe|backup.CMD|listold.txt|blablubb.bak|NONONONO.bad|"
    MsgBox(64, "Exclude", StringRegExpReplace($s_r, "(?i)[^\|]*\.(cmd|exe)\|", ""))
    $tempar = StringRegExp($s_r, "(?i)[^\|]*\.cmd|[^\|]*\.exe", 3)
    MsgBox(64, "Include", _ArrayToString($tempar,"|",1)& "|")

    [/autoit]