如果文本包含除之外的字符
本文关键字:字符 文本 包含 如果 | 更新日期: 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
}