我正在编写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);
}
}
}
}
你在这里看到的是实现这一目标的一种非常非常糟糕的方法,但这显然不是我想要使用的。
答案 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
}