У вас есть как минимум три варианта:
Используйте 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);
}
Примените 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;
}
Создайте свой собственный, основываясь на том факте, что метасхемы не должны меняться:
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, вы можете удалить пробел в качестве мета-символа.