C# Έλεγχος συμβολοσειράς Contains χωρίς ευαισθησία στην πεζότητα
Σε αυτό το σεμινάριο μαθαίνουμε διαφορετικούς τρόπους για να κάνουμε case insensitive string contains check σε C#
Μοιάζει με ένα απλό πρόβλημα, αλλά η προεπιλεγμένη μέθοδος string.Contains()
της C# είναι ευαίσθητη στην πεζότητα
Και αν η συμβολοσειρά δεν είναι στην αγγλική γλώσσα, δηλαδή για άλλες γλώσσες, δεν μπορούμε να συγκρίνουμε κείμενο case insensitive άμεσα
Οι δύο συμβολοσειρές θα πρέπει να είναι στην ίδια κουλτούρα και θα πρέπει να γνωρίζουμε την κουλτούρα της γλώσσας.
Τις περισσότερες φορές θα συγκρίνουμε συμβολοσειρές μόνο στην αγγλική γλώσσα.
Μέθοδος 1: Χρήση της μεθόδου C# string.IndexOf()
.
Μπορούμε να χρησιμοποιήσουμε τη μέθοδο C# string.IndexOf()
για να κάνουμε έλεγχο της συμβολοσειράς που περιέχει, χωρίς να λαμβάνουμε υπόψη την πεζότητα.
IndexOf()
η μέθοδος δέχεται την παράμετρο StringComparison.OrdinalIgnoreCase
, η οποία καθορίζει τον τύπο αναζήτησης που θα χρησιμοποιηθεί για τους χαρακτήρες.
string textToCheck = "STRING Contains";
bool contains = textToCheck.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;
Μέθοδος 2: Χρήση της μεθόδου string.Contains()
σε .Net 5+ & .NET Core 2.0+
Στις τελευταίες εκδόσεις της dot net, δηλαδή στις εκδόσεις .Net Core 2.0+ και .Net 5+. Η μέθοδος string.Contains()
έχει μια υπερφορτωμένη μέθοδο η οποία δέχεται την παράμετρο StringComparison
.
string textToCheck = "STRING Contains";
bool checkContains = textToCheck.Contains("string",StringComparison.OrdinalIgnoreCase);
Μέθοδος 3: Χρήση της μεθόδου Regex.IsMatch()
Μπορούμε να χρησιμοποιήσουμε κανονικές εκφράσεις για να κάνουμε έλεγχο συμβολοσειράς contains χωρίς ευαισθησία στην πεζότητα.
Αν είστε εξοικειωμένοι με τη μέθοδο Regex
, χρησιμοποιήστε τη μέθοδο Regex.IsMatch()
και για να ελέγξετε την έλλειψη ευαισθησίας στην πεζότητα περάστε την παράμετρο RegexOptions.IgnoreCase
var stringToSearch = "hI hEllo";
var substring = "hello";
bool contains = Regex.IsMatch(stringToCheck, Regex.Escape(substring), RegexOptions.IgnoreCase);
//true
Μέθοδος 4: Χρήση του .ToUpper()
& .ToLower()
Εάν τα αλφαριθμητικά είναι στην αγγλική γλώσσα και η απόδοση δεν αποτελεί πρόβλημα, μπορούμε να μετατρέψουμε και τα δύο αλφαριθμητικά στην ίδια περίπτωση και στη συνέχεια να κάνουμε τον έλεγχο του αλφαριθμητικού contains.
var stringToSearch = "hI hEllo";
var substring = "hello";
bool contains = stringToSearch.ToLower().Contains(substring.ToLower());
or
bool contains = stringToSearch.ToUpper().Contains(substring.ToUpper());
//true
C# Έλεγχος Contains χωρίς ευαισθησία στην πεζότητα για άλλες γλώσσες
Η έλλειψη ευαισθησίας στην πεζότητα εξαρτάται από τη γλώσσα
Για παράδειγμα, στην αγγλική γλώσσα I
είναι η έκδοση με κεφαλαία γράμματα του i
.
Ενώ στην τουρκική γλώσσα η έκδοση με κεφαλαία γράμματα του i
είναι ο άγνωστος χαρακτήρας İ
.
Για να κάνουμε τον έλεγχο συμβολοσειράς χωρίς πεζά γράμματα πρέπει να χρησιμοποιήσουμε το αντικείμενο CultureInfo
.
var text = "İ";
var check = "i";
CultureInfo trCulture = new CultureInfo("tr-TR",false);
bool englishContains = text.IndexOf(check, StringComparison.OrdinalIgnoreCase) >= 0;
//false
var turkishContains = trCulture.CompareInfo.IndexOf(check, text, CompareOptions.IgnoreCase) >= 0;
//true
Έχω δημιουργήσει το αντικείμενο CultureInfo
για την τουρκική γλώσσα. Και συνέκρινα και τις δύο συμβολοσειρές χρησιμοποιώντας το CompareInfo
όπως φαίνεται παρακάτω.
trCulture.CompareInfo.IndexOf(check, text, CompareOptions.IgnoreCase) >= 0;
Καλύτερος τρόπος για να κάνετε έλεγχο συμβολοσειράς Contains χωρίς ευαισθησία στην πεζότητα
Εάν χρησιμοποιείτε την τελευταία έκδοση του .Net
χρησιμοποιήστε τη μέθοδο string.Contains()
.
Διαφορετικά χρησιμοποιήστε τη μέθοδο string.IndexOf()
.
Μην προτιμάτε τη μέθοδο .ToUpper()
ή To.Lower()
καθώς μπορεί να οδηγήσουν σε προβλήματα απόδοσης.
Χρησιμοποιήστε το αντικείμενο CultureInfo
για συμβολοσειρές άλλων γλωσσών.