如何检查一个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)