如何检查字符串是否包含某些字符串

问题描述 投票:0回答:16

String
s
来确定它是否包含“a”或“b”或“c”,如下所示:

if (s.contains("a")||s.contains("b")||s.contains("c"))
c# string contains
16个回答
123
投票

这是一个几乎相同但更具可扩展性的 LINQ 解决方案:

new[] { "a", "b", "c" }.Any(c => s.Contains(c))

115
投票

好吧,总是有这样的:

public static bool ContainsAny(this string haystack, params string[] needles)
{
    foreach (string needle in needles)
    {
        if (haystack.Contains(needle))
            return true;
    }

    return false;
}

用途:

bool anyLuck = s.ContainsAny("a", "b", "c");

但是,没有什么可以与您的

||
比较链的性能相匹配。


83
投票
var values = new [] {"abc", "def", "ghj"};
var str = "abcedasdkljre";
values.Any(str.Contains);

52
投票

如果您正在寻找单个字符,您可以使用

String.IndexOfAny()

如果您想要任意字符串,那么我不知道 .NET 方法可以“直接”实现该目的,尽管正则表达式可以工作。


24
投票

你可以尝试使用正则表达式

string s;
Regex r = new Regex ("a|b|c");
bool containsAny = r.IsMatch (s);

24
投票

如果您需要具有特定

StringComparison
的ContainsAny(例如忽略大小写),那么您可以使用此字符串扩展方法。

public static class StringExtensions
{
    public static bool ContainsAny(this string input, IEnumerable<string> containsKeywords, StringComparison comparisonType)
    {
        return containsKeywords.Any(keyword => input.IndexOf(keyword, comparisonType) >= 0);
    }
}

StringComparison.CurrentCultureIgnoreCase
一起使用:

var input = "My STRING contains Many Substrings";
var substrings = new[] {"string", "many substrings", "not containing this string" };
input.ContainsAny(substrings, StringComparison.CurrentCultureIgnoreCase);
// The statement above returns true.

”xyz”.ContainsAny(substrings, StringComparison.CurrentCultureIgnoreCase);
// This statement returns false.

9
投票

这是一个“更好的解决方案”并且非常简单

if(new string[] { "A", "B", ... }.Any(s=>myString.Contains(s)))

7
投票
List<string> includedWords = new List<string>() { "a", "b", "c" };
bool string_contains_words = includedWords.Exists(o => s.Contains(o));

6
投票
public static bool ContainsAny(this string haystack, IEnumerable<string> needles)
{
    return needles.Any(haystack.Contains);
}

3
投票

由于字符串是字符的集合,因此您可以对它们使用 LINQ 扩展方法:

if (s.Any(c => c == 'a' || c == 'b' || c == 'c')) ...

这将扫描字符串一次并在第一次出现时停止,而不是为每个字符扫描一次字符串直到找到匹配项。

这也可以用于您喜欢的任何表达式,例如检查字符范围:

if (s.Any(c => c >= 'a' && c <= 'c')) ...

2
投票
// Nice method's name, @Dan Tao

public static bool ContainsAny(this string value, params string[] params)
{
    return params.Any(p => value.Compare(p) > 0);
    // or
    return params.Any(p => value.Contains(p));
}

Any
对于任何,
All
对于每个


2
投票
    static void Main(string[] args)
    {
        string illegalCharacters = "!@#$%^&*()\\/{}|<>,.~`?"; //We'll call these the bad guys
        string goodUserName = "John Wesson";                   //This is a good guy. We know it. We can see it!
                                                               //But what if we want the program to make sure?
        string badUserName = "*_Wesson*_John!?";                //We can see this has one of the bad guys. Underscores not restricted.

        Console.WriteLine("goodUserName " + goodUserName +
            (!HasWantedCharacters(goodUserName, illegalCharacters) ?
            " contains no illegal characters and is valid" :      //This line is the expected result
            " contains one or more illegal characters and is invalid"));
        string captured = "";
        Console.WriteLine("badUserName " + badUserName +
            (!HasWantedCharacters(badUserName, illegalCharacters, out captured) ?
            " contains no illegal characters and is valid" :
            //We can expect this line to print and show us the bad ones
            " is invalid and contains the following illegal characters: " + captured));  

    }

    //Takes a string to check for the presence of one or more of the wanted characters within a string
    //As soon as one of the wanted characters is encountered, return true
    //This is useful if a character is required, but NOT if a specific frequency is needed
    //ie. you wouldn't use this to validate an email address
    //but could use it to make sure a username is only alphanumeric
    static bool HasWantedCharacters(string source, string wantedCharacters)
    {
        foreach(char s in source) //One by one, loop through the characters in source
        {
            foreach(char c in wantedCharacters) //One by one, loop through the wanted characters
            {
                if (c == s)  //Is the current illegalChar here in the string?
                    return true;
            }
        }
        return false;
    }

    //Overloaded version of HasWantedCharacters
    //Checks to see if any one of the wantedCharacters is contained within the source string
    //string source ~ String to test
    //string wantedCharacters ~ string of characters to check for
    static bool HasWantedCharacters(string source, string wantedCharacters, out string capturedCharacters)
    {
        capturedCharacters = ""; //Haven't found any wanted characters yet

        foreach(char s in source)
        {
            foreach(char c in wantedCharacters) //Is the current illegalChar here in the string?
            {
                if(c == s)
                {
                    if(!capturedCharacters.Contains(c.ToString()))
                        capturedCharacters += c.ToString();  //Send these characters to whoever's asking
                }
            }
        }

        if (capturedCharacters.Length > 0)  
            return true;
        else
            return false;
    }

1
投票

您可以为您的扩展方法创建一个类并添加这个:

    public static bool Contains<T>(this string s, List<T> list)
    {
        foreach (char c in s)
        {
            foreach (T value in list)
            {
                if (c == Convert.ToChar(value))
                    return true;
            }
        }
        return false;
    }

1
投票

在 .NET 8+ 中,有一种新的更快的方法来搜索字符串中的字符。新类称为

SearchValues<T>
,它允许您执行以下操作:

using System.Buffers;

public class TestClass
{
    // A fixed set of characters. Works in .NET 8.
    private static readonly SearchValues<char> searchValues = SearchValues.Create([ 'a', 'b', 'c' ]);

    // A fixed set of strings. Works in .NET 9.
    // private static readonly SearchValues<string> searchValues2 = SearchValues.Create([ "Hi", "Hello" ], StringComparison.OrdinalIgnoreCase);

    static void Main(string[] args)
    {
        string text = "Hi friend";

        // In .NET 8.
        Console.WriteLine(text.AsSpan().ContainsAny(searchValues));

        // In .NET 9.
        // Console.WriteLine(text.AsSpan().ContainsAny(searchValues2));
    }
}

https://github.com/dotnet/runtime/pull/78093 显示了使用

SearchValues
可以获得的性能改进(请注意,它最初被称为
IndexOfAnyValues
,直到被 重命名。)


0
投票

您可以使用正则表达式

if(System.Text.RegularExpressions.IsMatch("a|b|c"))

0
投票

如果这是有要求的密码检查器,请尝试以下操作:

public static bool PasswordChecker(string input)
{
    // determins if a password is save enough
    if (input.Length < 8)
        return false;

    if (!new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
                        "S", "T", "U", "V", "W", "X", "Y", "Z", "Ä", "Ü", "Ö"}.Any(s => input.Contains(s)))
    return false;

    if (!new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}.Any(s => input.Contains(s)))
    return false;

    if (!new string[] { "!", "'", "§", "$", "%", "&", "/", "(", ")", "=", "?", "*", "#", "+", "-", "_", ".",
                        ",", ";", ":", "`", "´", "^", "°",   }.Any(s => input.Contains(s)))
    return false;

    return true; 
}

这会将密码设置为最小长度为 8,并使用至少一个大写字符、至少一个数字和至少一个特殊字符

© www.soinside.com 2019 - 2024. All rights reserved.