Pertanyaan Case insensitive 'Berisi (string)'


Apakah ada cara untuk membuat kembali berikut ini benar?

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

Sepertinya tidak ada kelebihan beban yang memungkinkan saya untuk mengatur sensitivitas kasus .. Saat ini saya MENDAFTAR keduanya, tapi itu hanya konyol (yang saya maksudkan dengan i18n masalah yang datang dengan casing naik dan turun).

MEMPERBARUI
Pertanyaan ini kuno dan sejak itu saya menyadari saya meminta jawaban sederhana untuk topik yang sangat luas dan sulit jika Anda peduli untuk menyelidiki sepenuhnya.
Untuk sebagian besar kasus, dalam basis kode bahasa Inggris mono-lingual ini Jawabannya akan cukup. Saya mencurigai karena kebanyakan orang yang datang ke sini termasuk dalam kategori ini, ini adalah jawaban yang paling populer.
Ini Namun, menjawab membawa masalah yang melekat bahwa kita tidak dapat membandingkan teks tidak sensitif huruf sampai kita tahu kedua teks adalah budaya yang sama dan kita tahu apa budaya itu. Ini mungkin jawaban yang kurang populer, tetapi saya pikir itu lebih benar dan itulah mengapa saya menandainya sebagai demikian.


2416
2018-01-14 21:39


asal


Jawaban:


Untuk menguji apakah string paragraph berisi string word (terima kasih @QuarterMeister)

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

Dimana culture adalah contoh dari CultureInfo menggambarkan bahasa yang ditulis teks.

Solusi ini transparan tentang definisi case-insensitivity, yang bergantung pada bahasa. Misalnya, bahasa Inggris menggunakan karakter I dan i untuk versi huruf besar dan kecil huruf kesembilan, sedangkan bahasa Turki menggunakan karakter ini untuk surat kesebelas dan kedua belas dari alfabet 29 huruf-panjangnya. Versi huruf besar Turki 'i' adalah karakter asing 'İ'.

Dengan demikian string tin dan TIN adalah kata yang sama dalam Bahasa Inggris, tetapi kata-kata yang berbeda dalam bahasa Turki. Seperti yang saya mengerti, satu berarti 'roh' dan yang lainnya adalah kata onomatopoeia. (Orang Turki, perbaiki saya jika saya salah, atau sarankan contoh yang lebih baik)

Untuk meringkas, Anda hanya dapat menjawab pertanyaan 'apakah kedua string ini sama tetapi dalam kasus yang berbeda' jika Anda tahu bahasa apa teks itu berada. Jika Anda tidak tahu, Anda harus mengambil tendangan. Mengingat hegemoni bahasa Inggris dalam perangkat lunak, Anda mungkin harus menggunakan CultureInfo.InvariantCulture, karena itu akan salah dalam cara yang akrab.


1083
2018-03-17 18:22



Anda bisa menggunakan Metode String.IndexOf dan lulus StringComparison.OrdinalIgnoreCase sebagai jenis pencarian yang digunakan:

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

Lebih baik lagi mendefinisikan metode ekstensi baru untuk string:

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

Perhatikan itu propagasi null  ?. tersedia sejak C # 6.0 (VS 2015), untuk penggunaan versi lama

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

PEMAKAIAN:

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

2356
2018-01-14 21:44



Kamu dapat memakai IndexOf() seperti ini:

string title = "STRING";

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

Karena 0 (nol) bisa menjadi indeks, Anda mengecek ke -1.

MSDN

Posisi indeks berbasis nol dari nilai jika string itu ditemukan, atau -1   Jika tidak. Jika nilai adalah String.Empty, nilai kembalian adalah 0.


203
2018-01-14 21:48



Solusi alternatif menggunakan Regex:

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

Melihat

Seperti yang ditunjukkan oleh @cHao dalam komentarnya, ada skenario yang akan menyebabkan solusi ini mengembalikan hasil yang salah. Pastikan Anda tahu apa yang Anda lakukan sebelum menerapkan solusi ini sembarangan.


115
2017-07-28 17:18



Anda selalu bisa menaikkan atau menurunkan string terlebih dahulu.

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

Ups, lihat saja bagian terakhir itu. Sebuah case sensitive dibandingkan akan *mungkin* lakukan hal yang sama pula, dan jika kinerja bukan masalah, saya tidak melihat masalah dengan membuat salinan huruf besar dan membandingkannya. Saya berani bersumpah bahwa saya pernah melihat case-insensitive dibandingkan sekali ...


62
2018-01-14 21:42



Salah satu masalah dengan jawabannya adalah bahwa itu akan membuang pengecualian jika string adalah nol. Anda dapat menambahkannya sebagai cek sehingga tidak akan:

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



Kelas StringExtension adalah jalan ke depan, saya telah menggabungkan beberapa posting di atas untuk memberikan contoh kode lengkap:

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



Ini bersih dan sederhana.

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

31
2017-11-09 04:25