如何确定字符串是否具有正则表达式元字符? (C#)

时间:2009-06-18 16:34:52

标签: c# regex string

System.Text.RegularExpressions命名空间是否为我提供了任何可以发现输入字符串是否具有(“abc [0-9]”或“^ aeiou $”)或者没有(“abc123”)元字符的内容?或者我是否必须手动检查某个列表中的非转义字符?

1 个答案:

答案 0 :(得分:5)

您至少有三个选择:

  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. 根据metachars不应更改的事实创建自己的:

    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;
    }
    
  4. 第三种方法提供更多控制,具体取决于您在Regex中使用的RegexOptions。例如,如果您永远不会使用RegexOptions.IgnorePatternWhitespace,则可以将空格删除为元数据。