Câu trả lời:
Nếu bạn đang tìm kiếm các ký tự đơn, bạn có thể sử dụng String.IndexOfAny()
.
Nếu bạn muốn các chuỗi tùy ý, thì tôi không biết phương thức .NET để đạt được điều đó "trực tiếp", mặc dù một biểu thức chính quy sẽ hoạt động.
Chà, luôn có điều này:
public static bool ContainsAny(this string haystack, params string[] needles)
{
foreach (string needle in needles)
{
if (haystack.Contains(needle))
return true;
}
return false;
}
Sử dụng:
bool anyLuck = s.ContainsAny("a", "b", "c");
||
Tuy nhiên, sẽ không có gì phù hợp với hiệu suất của chuỗi so sánh của bạn .
public static bool ContainsAny(this string haystack, params string[] needles) { return needles.Any(haystack.Contains); }
Đây là một giải pháp LINQ gần như giống nhau nhưng có khả năng mở rộng hơn:
new[] { "a", "b", "c" }.Any(c => s.Contains(c))
var values = new [] {"abc", "def", "ghj"};
var str = "abcedasdkljre";
values.Any(str.Contains);
Bạn có thể thử với biểu thức chính quy
string s;
Regex r = new Regex ("a|b|c");
bool containsAny = r.IsMatch (s);
Nếu bạn cần ContainsAny với một cụ thể StringComparison
(ví dụ: bỏ qua chữ hoa chữ thường) thì bạn có thể sử dụng phương thức String Extentions này.
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);
}
}
Sử dụng với 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.
Vì một chuỗi là một tập hợp các ký tự, bạn có thể sử dụng các phương thức mở rộng LINQ trên chúng:
if (s.Any(c => c == 'a' || c == 'b' || c == 'c')) ...
Thao tác này sẽ quét chuỗi một lần và dừng lại ở lần xuất hiện đầu tiên, thay vì quét chuỗi một lần cho mỗi ký tự cho đến khi tìm thấy khớp.
Điều này cũng có thể được sử dụng cho bất kỳ biểu thức nào bạn thích, ví dụ: kiểm tra một loạt các ký tự:
if (s.Any(c => c >= 'a' && c <= 'c')) ...
List<string> includedWords = new List<string>() { "a", "b", "c" };
bool string_contains_words = includedWords.Exists(o => s.Contains(o));
// 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
cho bất kỳ, All
cho mọi
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;
}
Bạn có thể sử dụng Biểu thức chính quy
if(System.Text.RegularExpressions.IsMatch("a|b|c"))
trie
cấu trúc dữ liệu.