menghitung string dengan karakter khusus dalam string di c#

Saya ingin menghitung string (istilah pencarian) di string lain (file log). Memisahkan string dengan metode Split dan mencari array setelahnya terlalu tidak efisien bagi saya, karena file lognya sangat besar.

Di internet saya menemukan kemungkinan berikut, yang cukup berhasil sejauh ini. Namun,

count = Regex.Matches(_editor.Text, txtLookFor.Text, RegexOptions.IgnoreCase).Count;

Saya sekarang mengalami masalah lain di sana, yaitu saya mendapatkan kesalahan berikut ketika saya menghitung string dalam format "Nachricht erhalten (".

Pesan eror:

System.ArgumentException: "Nachricht erhalten (" dianalisis - tidak cukup ) -karakter.


person Soeren3003    schedule 29.04.2020    source sumber


Jawaban (1)


Anda harus keluar dari simbol ( karena simbol ini memiliki fungsi khusus dalam ekspresi reguler:

var test = Regex.Matches("Nachricht erhalten (3)", @"Nachricht erhalten \(", RegexOptions.IgnoreCase).Count;

Jika Anda melakukan ini dengan input pengguna di mana pengguna tidak terbiasa dengan ekspresi reguler, Anda mungkin lebih mudah menggunakan IndexOf dalam perulangan while, di mana Anda tetap menggunakan indeks baru yang ditemukan di perulangan terakhir. Yang mungkin juga memiliki kinerja sedikit lebih baik daripada ekspresi reguler. Contoh:

var test = "This is a test";
var searchFor = "is";
var count = 0;
var index = test.IndexOf(searchFor, 0);
while (index != -1)
{
    ++count;
    index = test.IndexOf(searchFor, index + searchFor.Length);
} 
person 404    schedule 29.04.2020
comment
Apakah ada karakter lain yang perlu saya hindari? Suka - . › ? - person Soeren3003; 29.04.2020
comment
@ Soeren3003 Lihat : Karakter apa yang perlu di-escape di .NET Regex ? , Anda cukup menggunakan Regex.Escape - person Pac0; 29.04.2020
comment
if you do this by user input -› hati-hati, seseorang tidak boleh mengeksekusi ekspresi reguler sewenang-wenang tanpa hati-hati (gunakan batas waktu atau contoh). Ini bukan hanya untuk kemudahan bagi pengguna, tetapi juga dapat menjadi kerentanan (Penolakan layanan, lihat [meziantou.net/regex-deny-of-service-redos.htm] dan telusuri kemunduran yang membawa bencana - person Pac0; 29.04.2020
comment
Terima kasih atas informasi dan kode sumbernya. Saya telah membandingkan keduanya satu kali dan mendapatkan hasil berikut: 00.0396874 detik While dan 00.0039259 detik Regex. Namun demikian, saya memutuskan untuk menggunakan loop while, karena kinerjanya cukup untuk aplikasi saya. - person Soeren3003; 29.04.2020
comment
@ Soeren3003 benar. Itu tergantung pada konteksnya. Regex cepat untuk beberapa kejadian, tetapi untuk file yang lebih besar dengan banyak kejadian, regex akan menjadi jauh lebih lambat karena alokasi yang dihasilkan (yang juga menghabiskan memori dengan cepat). - person 404; 29.04.2020