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

本文关键字:字符 文本 包含 如果 | 更新日期: 2023-09-27 17:59:25

我正在编写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);
            }
        }
    }
}

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

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

您可以进行以下操作:

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

备选方案:

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

如果你只想检查是否有除这三个字符之外的其他字符,你可以使用高效的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)。如果这还不够,您需要一个正则表达式或循环。

编辑:您也可以使用高效的String.IndexOfAny方法来代替LINQ:

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