Question "Insensible à la casse" Contient (chaîne) "


Y at-il un moyen de rendre le retour suivant vrai?

string title = "ASTRINGTOTEST";
title.Contains("string");

Il ne semble pas y avoir de surcharge qui me permet de régler la sensibilité à la casse. Actuellement, je les UPPERCASE tous les deux, mais c'est juste idiot (par lequel je fais référence à la i18n problèmes qui viennent avec haut et bas boîtier).

METTRE À JOUR
Cette question est ancienne et depuis je me suis rendu compte que je demandais une réponse simple pour un sujet vraiment vaste et difficile si vous voulez l'étudier complètement.
Dans la plupart des cas, dans des bases de code anglaises monolingues ce la réponse suffira. Je me doute parce que la plupart des gens qui viennent ici tombent dans cette catégorie c'est la réponse la plus populaire.
Ce La réponse soulève cependant le problème inhérent que nous ne pouvons pas comparer les cas de texte insensible jusqu'à ce que nous sachions que les deux textes sont la même culture et nous savons ce qu'est cette culture. C'est peut-être une réponse moins populaire, mais je pense que c'est plus correct et c'est pourquoi je l'ai marqué comme tel.


2416
2018-01-14 21:39


origine


Réponses:


Pour tester si la chaîne paragraph contient la chaîne word (merci @QuarterMeister)

culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0

culture est l'instance de CultureInfo décrire la langue dans laquelle le texte est écrit.

Cette solution est transparente à propos de la définition de l'insensibilité à la casse, qui dépend de la langue. Par exemple, la langue anglaise utilise les caractères I et i pour les versions majuscules et minuscules de la neuvième lettre, alors que la langue turque utilise ces caractères pour la onzième et douzième lettres de son alphabet de 29 lettres. La version en majuscule turque de 'i' est le caractère inconnu 'İ'.

Ainsi les cordes tin et TIN sont le même mot en anglais, mais des mots différents En Turquie. Si je comprends bien, l'un signifie «esprit» et l'autre est un mot onomatopée. (Turcs, corrigez-moi si je me trompe, ou suggérez un meilleur exemple)

Pour résumer, vous pouvez seulement répondre à la question "ces deux chaînes sont-elles identiques mais dans des cas différents" si vous savez dans quelle langue se trouve le texte. Si tu ne le sais pas, tu devras prendre un punt. Compte tenu de l'hégémonie de l'anglais dans les logiciels, vous devriez probablement recourir à CultureInfo.InvariantCulture, parce que ça va mal de façon familière.


1083
2018-03-17 18:22



Vous pouvez utiliser le String.IndexOf, méthode et passe StringComparison.OrdinalIgnoreCase comme type de recherche à utiliser:

string title = "STRING";
bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;

Mieux vaut définir une nouvelle méthode d'extension pour la chaîne:

public static class StringExtensions
{
    public static bool Contains(this string source, string toCheck, StringComparison comp)
    {
        return source?.IndexOf(toCheck, comp) >= 0;
    }
}

Notez que propagation nulle  ?. est disponible depuis C # 6.0 (VS 2015), pour les versions plus anciennes

if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;

USAGE:

string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);

2356
2018-01-14 21:44



Vous pouvez utiliser IndexOf() comme ça:

string title = "STRING";

if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
    // The string exists in the original
}

Puisque 0 (zéro) peut être un index, vous vérifiez par rapport à -1.

MSDN

La position d'index de base zéro de la valeur si cette chaîne est trouvée, ou -1   si ce n'est pas le cas. Si la valeur est String.Empty, la valeur de retour est 0.


203
2018-01-14 21:48



Autre solution utilisant Regex:

bool contains = Regex.IsMatch("StRiNG to search", "string", RegexOptions.IgnoreCase);

Remarquer

Comme @cHao l'a souligné dans son commentaire, il y a des scénarios qui vont amener cette solution à retourner des résultats incorrects. Assurez-vous de savoir ce que vous faites avant d'implanter cette solution au hasard.


115
2017-07-28 17:18



Vous pouvez toujours monter ou descendre les cordes d'abord.

string title = "string":
title.ToUpper().Contains("STRING")  // returns true

Oups, juste vu ce dernier morceau. Un cas insensible comparerait *Probablement* faire de même de toute façon, et si la performance n'est pas un problème, je ne vois pas de problème à créer des copies majuscules et à les comparer. J'aurais pu jurer que j'ai vu une fois un cas insensible comparer une fois ...


62
2018-01-14 21:42



Un problème avec la réponse est qu'il lancera une exception si une chaîne est nulle. Vous pouvez ajouter cela comme une vérification, donc ce ne sera pas:

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))
        return true;

    return source.IndexOf(toCheck, comp) >= 0;
} 

48
2017-12-07 21:11



La classe StringExtension est la voie à suivre, j'ai combiné quelques-uns des messages ci-dessus pour donner un exemple de code complet:

public static class StringExtensions
{
    /// <summary>
    /// Allows case insensitive checks
    /// </summary>
    public static bool Contains(this string source, string toCheck, StringComparison comp)
    {
        return source.IndexOf(toCheck, comp) >= 0;
    }
}

32
2017-11-18 16:48



C'est propre et simple.

Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)

31
2017-11-09 04:25



OrdinalIgnoreCase, CurrentCultureIgnoreCase ou InvariantCultureIgnoreCase?

Comme cela manque, voici quelques recommandations sur le moment d'utiliser lequel:

Dos

  • Utilisation StringComparison.OrdinalIgnoreCase pour des comparaisons en tant que valeur par défaut pour la mise en correspondance des chaînes indépendantes de la culture.
  • Utilisation StringComparison.OrdinalIgnoreCase des comparaisons pour une vitesse accrue.
  • Utilisation StringComparison.CurrentCulture-based opérations de chaîne lors de l'affichage de la sortie à l'utilisateur.
  • Changer l'utilisation actuelle des opérations de chaîne en fonction de l'invariant culture pour utiliser le non-linguistique StringComparison.Ordinal ou StringComparison.OrdinalIgnoreCase quand la comparaison est
    linguistiquement non pertinent (symbolique, par exemple).
  • Utilisation ToUpperInvariant plutôt que ToLowerInvariant quand normaliser les chaînes pour la comparaison.

Ne pas faire

  • Utilisez des surcharges pour les opérations de chaîne qui ne sont pas explicitement ou spécifiez implicitement le mécanisme de comparaison de chaîne.
  • Utilisation StringComparison.InvariantCulture chaîne basée
    opérations dans la plupart des cas; l'une des rares exceptions serait
    persistantes sur le plan linguistique mais culturellement agnostiques.

Sur la base de ces règles, vous devez utiliser:

string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{
    // The string exists in the original
}

alors que [YourDecision] dépend des recommandations d'en haut.

lien de source: http://msdn.microsoft.com/en-us/library/ms973919.aspx


24
2018-06-17 10:31