2010-06-28 15 views
6

Ich bin sehr neu in RegEx - also kann mir bitte jemand helfen, herauszufinden, was genau hier falsch läuft?RegEx - Quantifizierer {x, y} folgt nichts Fehler

Ich habe diesen Code:

 string regPattern = "*[~#%&*{}/<>?|\"-]+*"; 
     string replacement = ""; 
     Regex regExPattern = new Regex(regPattern); 

Doch wenn mein app die regExPattern Linie trifft, erhalte ich eine Argument - Quantifizierer {x, y} folgend nichts Fehler.

Kann jemand helfen?

EDIT: Ich brauche dieses Muster in eine foreach-Schleife wie so passieren:

if (paths.Contains(regPattern)) 
     { 
      foreach (string files2 in paths) 
      { 
       try 
       { 
        string filenameOnly = Path.GetFileName(files2); 
        string pathOnly = Path.GetDirectoryName(files2); 
        string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement); 
        string sanitized = Path.Combine(pathOnly, sanitizedFileName); 
        //write to streamwriter 
        System.IO.File.Move(files2, sanitized); 

       } 
       catch (Exception ex) 
       { 
        //write to streamwriter 

       } 
      } 
     } 
     else 
     { 
     //write to streamwriter 

     } 

Wie ich das Muster definieren tun, wenn es in diese Schleife geführt wird?

+0

Um genau zu sein - das Muster, das ich im Code habe, soll diese ungültigen Zeichen in Dateinamen loswerden. daher muss ich ein Sternchen, eine Tilde, ein Pfundzeichen, Klammern, spitze Klammern usw. loswerden. ist das das richtige Muster dafür? – yeahumok

Antwort

6

Update: nach dem Kommentar auf die Frage zu lesen Ich denke, wollen Sie einfach:

s = Regex.Replace(s, "[~#%&*{}/<>?|\"-]+", ""); 

Alte Antwort: Ich denke, wenn Sie * schreiben Sie Platzhalter wie diejenigen denken, die Sie eingeben würden in einer Schale:

* .txt

Dies ist nicht, wie die * Werke in Syntax für reguläre Ausdrücke. Was Sie wahrscheinlich stattdessen wollen, ist .*:

".*[~#%&*{}/<>?|\"-]+.*" 

Die . Mittel „beliebiges Zeichen“ und die * bedeutet „Null oder mehr der vorherigen“.

Innerhalb der Zeichenklasse [...] verliert die * ihre spezielle Bedeutung und wird zu einem Literalzeichen, so dass sie nicht maskiert werden muss. Wenn Sie es unnötigerweise innerhalb der Charakterklasse verschwinden lassen, wird es keinen Schaden verursachen und manche Leute finden es leichter zu lesen.

+0

* bedeutet Sternchen - kein Zeichen. Muss ich es noch Backslash? – yeahumok

+0

Die Bedeutung von '*' ändert sich abhängig davon, ob es sich innerhalb einer Zeichenklasse befindet oder nicht. Innerhalb einer Zeichenklasse bedeutet es ein buchstäbliches '*', ob es maskiert ist oder nicht. Außerhalb einer Zeichenklasse bedeutet es "Null oder mehr", wenn es nicht dekodiert wird, und ein Literal "*", wenn es entkoppelt ist. –

+0

+1 (für die Revision), und in C# sollten Sie Verbatim-Strings für Regexes verwenden.Sie verwenden den Backslash nicht als Escape-Zeichen; Sie müssen das Anführungszeichen nur durch ein anderes Anführungszeichen verlassen: '@ '[~ #% & * {}/<>? |" "-] +" ' –

1

Der * ist ein Quantifizierer, der "null oder mehr Male" bedeutet (wie {0,}). Sie werden fliehen müssen sie einen umgekehrten Schrägstrich wie folgt aus: \*

0

Da Sie eine Regex.Replace tun Spiele mit einem leeren String eines dieser ein Zeichen zu ersetzen:

 string pattern = "[~#%&*{}/()<>?|\"\\\\-^[\\]]"; 

     string input = @"(*&af%\#$}afd]a#f%hjg{d(^(^[RF*()^FR(7r5"; 

     string output = Regex.Replace(input, pattern, String.Empty); 
0

hinzufügen . vor dem *

z string regPattern = ".*[~#%&*{}/<>?|\"-]+.*";