2009-06-18 9 views

Répondre

5

Vous avez au moins trois options:

  1. Utilisez Regex.Escape et comparer le résultat:

    private static bool ContainsMetaCharacters(string s) 
    { 
        if (String.IsNullOrEmpty(s)) 
        { 
         return false; 
        } 
        string escaped = Regex.Escape(s); 
        return !escaped.Equals(s, StringComparison.Ordinal); 
    } 
    
  2. Appliquer Regex.Escape à chaque personnage pour voir si la valeur échappée est différente:

    private static bool ContainsMetaCharacters(string s) 
    { 
        if (String.IsNullOrEmpty(s)) 
        { 
         return false; 
        } 
        for (int i = 0; i < s.Length; i++) 
        { 
         if (Regex.Escape(s.Substring(i,1))[0] != s[i]) 
         { 
          return true; 
         } 
        } 
        return false; 
    } 
    
  3. Créez votre o WN basé sur le fait que les metachars ne devraient pas changer:

    private static readonly char[] _MetaChars = 
        new char[] 
        { '\t', '\n', '\f', '\r', 
         ' ', '#', '$', '(', ')', 
         '*', '+', '.', '?', 
         '[', '\\', '^', '{', '|' }; 
    
    private static bool ContainsMetaCharacters(string s) 
    { 
        if(String.IsNullOrEmpty(s)) 
        { 
         return false; 
        } 
        return s.IndexOfAny(_MetaChars) >= 0; 
    } 
    

La troisième approche offre plus de contrôle en fonction de la RegexOptions que vous utilisez dans votre Regex. Par exemple, si vous n'utilisez jamais RegexOptions.IgnorePatternWhitespace, vous pouvez supprimer de l'espace en tant que métachar.

+0

DOUCE! Merci! En passant, est-ce que remercier les gens dans les commentaires dans l'étiquette ici, ou est-ce considéré comme un bruit inutile? – JCCyC

+0

Je pense que les commentaires sont bien :) Heureux que je pourrais aider –

+0

Je suis tombé sur cette méthode quand j'ai fait un plongeon profond sur le moteur d'expressions régulières de .net: http://www.moserware.com/2009/03/how-net-regular -expressions-really-work.html –

Questions connexes