如何检查一个string是否包含任何一些string

我想在C#中检查一个String是否包含“a”或“b”或“c”。 我正在寻找比使用更好的解决scheme

if (s.contains("a")||s.contains("b")||s.contains("c")) 

如果您正在查找单个字符,则可以使用String.IndexOfAny()

如果你想要任意string,那么我不知道一个.NET方法来实现“直接”,虽然正则expression式将工作。

那么,总是有这样的:

 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"); 

什么都不会匹​​配你的链条的性能 比较,但是。

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

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

你可以尝试正则expression式

 string s; Regex r = new Regex ("a|b|c"); bool containsAny = r.IsMatch (s); 
 var values = new [] {"abc", "def", "ghj"}; var str = "abcedasdkljre"; values.Any(str.Contains); 

这是一个“更好的解决scheme”,很简单

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

如果你需要一个特定的StringComparison ContainsAny(例如忽略大小写),那么你可以使用这个String Extentions方法。

 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 though" }; input.ContainsAny(substrings, StringComparison.CurrentCultureIgnoreCase); 

由于string是一个字符集合,因此您可以在它们上使用LINQ扩展方法:

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

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

这也可以用于任何你喜欢的expression,例如检查一系列字符:

 if (s.Any(c => c >= 'a' && c <= 'c')) ... 
 public static bool ContainsAny(this string haystack, IEnumerable<string> needles) { return needles.Any(haystack.Contains); } 
 // 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为所有,为所有

您可以使用正则expression式

 if(System.Text.RegularExpressions.IsMatch("a|b|c")) 
 List<string> includedWords = new List<string>() { "a", "b", "c" }; bool string_contains_words = includedWords.Exists(o => s.Contains(o)); 
  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; } 

如果您正在查找任意string,而不仅仅是字符,则可以使用IndexOfAny的重载,该重载从新项目NLib接收string参数:

 if (s.IndexOfAny("aaa", "bbb", "ccc", StringComparison.Ordinal) >= 0)