如果文本包含除以外的字符

时间:2014-04-23 09:25:11

标签: c# string

我正在编写StyleCop规则。作为其中的一部分,我正在寻找字符串。

如果它们包含'/', '{', '}'whitespace个字符以外的任何文字,我想对它们执行某些操作。

如何仅定位包含除这些字符以外的任何字符串的字符串?

请注意:它们还可以包含上述字符;但如果发现除此之外的任何其他内容,我希望它们被标记。

编辑:根据要求,到目前为止我对规则的进展。我正在检查注释,看它们是否包含禁用的代码。因为这标志着许多行代码简单地:// {(和其他);我希望排除这些行。

public static void IsCommentDisabledCodeComment(Class classItem, IfSQRules context)
{
    foreach (CsToken token in classItem.Tokens)
    {
        if (token.CsTokenType == CsTokenType.MultiLineComment || token.CsTokenType == CsTokenType.SingleLineComment)
        {
            if (token.Text != "//   }" && token.Text != "//  }" && token.Text != "// }" && token.Text != "//}" && token.Text != "//    }" && token.Text != "////     }" && token.Text != "//      }" && token.Text != "//       }" && token.Text != "////   {" && token.Text != "//  {" && token.Text != "// {" && token.Text != "//    {" && token.Text != "//     {" && token.Text != "//      {" && token.Text != "//       {" && token.Text != "//{")
            {
                if (token.Text.Contains("()") || token.Text.Contains("[]") || token.Text.Contains("{") || token.Text.Contains("}"))
                    context.AddViolation(classItem, token.LineNumber, "ThereShouldNotBeAnyDisabledCode", token.Text);
            }
        }
    }
}

你在这里看到的是实现这一目标的一种非常非常糟糕的方法,但这显然不是我想要使用的。

2 个答案:

答案 0 :(得分:4)

您可以进行以下操作:

if (!Regex.IsMatch(token.Text, @"^[/{}\s]*$"))
{
  // your code
}

替代:

if (Regex.IsMatch(token.Text, @"[^/{}\s]"))
{
  // your code
}

答案 1 :(得分:2)

如果您只是想检查是否还有其他三个字符,您可以使用高效Enumerable.Except + Enumerable.Any

static char[] comments = { '/', '{', '}', ' ', '\t' };

public static void IsCommentDisabledCodeComment(Class classItem, IfSQRules context)
{
    // ...
        if (token.Text.Except(comments).Any())
        {
            // something other 
        }
    // ...
}

然而,这是一个非常天真的方法,只能回答你的初步问题。它不关心角色的顺序。它也不会将制表符或换行符视为空格(如Char.IsWhiteSpace)。如果这还不够,则需要regex或循环。

修改:您也可以使用高效的String.IndexOfAny-method代替LINQ:

if (token.Text.IndexOfAny(comments) >= 0)
{
    // something other 
}