Как определить, есть ли в строке метасимволы регулярных выражений? (С #) - PullRequest
1 голос
/ 18 июня 2009

Предлагает ли мне пространство имен System.Text.RegularExpressions что-нибудь, чтобы узнать, имеет ли входная строка ("abc [0-9]" или "^ aeiou $") или нет ("abc123") метасимволы? Или мне нужно вручную проверять наличие неэкранированных символов в определенном списке?

1 Ответ

5 голосов
/ 18 июня 2009

У вас есть как минимум три варианта:

  1. Используйте Regex.Escape и сравните результат:

    private static bool ContainsMetaCharacters(string s)
    {
        if (String.IsNullOrEmpty(s))
        {
            return false;
        }
        string escaped = Regex.Escape(s);
        return !escaped.Equals(s, StringComparison.Ordinal);
    }
    
  2. Примените Regex.Escape к каждому символу, чтобы увидеть, отличается ли экранированное значение:

    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. Создайте свой собственный, основываясь на том факте, что метасхемы не должны меняться:

    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;
    }
    

Третий подход предлагает больший контроль в зависимости от RegexOptions , которые вы используете в Regex. Например, если вы никогда не будете использовать RegexOptions.IgnorePatternWhitespace, вы можете удалить пробел в качестве мета-символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...