繁体   English   中英

使用数组检查字符串是否包含特定字符串

[英]Check if a string contains a specific string using array

我是c#的新手。 我想知道一个字符串,如用户名是否包含特定的单词。 我想从数组中获取这些特定的单词。这是一个例子

Console.Write("Name: ");
_name = Console.ReadLine();
name = Program.ProperNameMethod( _name);
Console.WriteLine();

string[] badWordArray = { "aBadword1", "aBadWord2", "aBadWord3" };

if (!string.IsNullOrEmpty(name) // Would like to check for the badwordarray aswell)

(更新)

谢谢大家,但是我学习c#只用了大约一个月就无法覆盖lambda或regex了。 我稍后会看一下这些代码。

使用以下lambda表达式来查找name是否包含错误单词。

 bool nameHasBadWords = badWordArray.Any(p => name.Contains(p));

这是我能做的;

        // Lowered bad words array
        string[] badWordArray = { "abadword1", "abadword2", "abadword3" };

        bool isBadWord = false;
        if (!string.IsNullOrEmpty(name))
        {
            name = name.ToLower();
            isBadWord = badWordArray.Any(badWord => name.Contains(badWord));
        }

我也测试了其他答案;

459毫秒

.Any(badWord => string.Equals(name, badWord, StringComparison.CurrentCultureIgnoreCase));

1464毫秒

.Any(badWord => name.IndexOf(badWord, StringComparison.CurrentCultureIgnoreCase) >= 0);

247毫秒

.Any(badWord => name.Contains(badWord));

这是我的简单( 和愚蠢 )测试代码:

        var name = "tuckyou";

        // Lowered bad words array
        string[] badWordArray = { "abadword1", "abadword2", "abadword3" };

        Stopwatch stopwatch = new Stopwatch();

        int oneMillion = 1000000;

        bool isBadWord = false;

        stopwatch.Start();
        for (int i = 0; i < oneMillion; i++)
        {
            isBadWord = badWordArray.Any(badWord => string.Equals(name, badWord, StringComparison.CurrentCultureIgnoreCase));
        }
        stopwatch.Stop();

        Console.WriteLine(stopwatch.ElapsedMilliseconds);
        stopwatch.Reset();

        stopwatch.Start();
        for (int i = 0; i < oneMillion; i++)
        {
            isBadWord = badWordArray.Any(badWord => name.IndexOf(badWord, StringComparison.CurrentCultureIgnoreCase) >= 0);
        }
        stopwatch.Stop();

        Console.WriteLine(stopwatch.ElapsedMilliseconds);
        stopwatch.Reset();

        stopwatch.Start();
        if (!string.IsNullOrEmpty(name))
        {
            name = name.ToLower();
        }

        for (int i = 0; i < oneMillion; i++)
        {
            isBadWord = badWordArray.Any(badWord => name.Contains(badWord));
        }
        stopwatch.Stop();

        Console.WriteLine(stopwatch.ElapsedMilliseconds);

        Console.ReadLine();

当然,使用stopWatch并不准确。 但它提出了一个想法。

您可能需要不区分大小写的验证:

string[] badWordArray = { "aBadword1", "aBadWord2", "aBadWord3" };

Boolean isBadWord = badWordArray
  .Any(badWord => name.IndexOf(badword, StringComparison.OrdinalIgnoreCase) >= 0);

或者,如果您验证当前的文化

Boolean isBadWord = badWordArray
  .Any(badWord => name.IndexOf(badWord, StringComparison.CurrentCultureIgnoreCase) >= 0);

Paranoic案例涉及使用这样的正则表达式

   string[] badWordArray = { "aBadword1", "aBadWord2", "aBadWord3" };

   // Nasty user wants to be rude but pass typical filters...
   String name = "A- Bad..WORD..1 !!!";

   String line = Regex.Replace(name, @"\W", "");

   Boolean isBadWord = badWordArray
     .Any(badWord => line.IndexOf(badWord, StringComparison.OrdinalIgnoreCase) >= 0);

考虑到你说你是初学者。 这是一种更简单的方法。 我知道这些答案比这更好,但这对初学者来说应该是好的。

            Console.Write("Name: ");
            string userInput = Console.ReadLine();

            //The words that you dont want your user to have
            string[] array = new string[2];
            array[0] = "bad";
            array[1] = "reallybad";

            for (int i = 0; i < array.Length; i++)
            {

                //Used to lower so user cant get away with stuffs like: rEALLyBAd
                if (userInput.Contains(array[i].ToLower()))
                {

                    Console.WriteLine("Invalid name!");

                }

            }

            Console.ReadKey();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM