การนับสตริงด้วยอักขระพิเศษในสตริงใน c#

ฉันต้องการนับสตริง (คำค้นหา) ในสตริงอื่น (logfile) การแยกสตริงด้วยวิธี Split และค้นหาอาร์เรย์ในภายหลังนั้นไม่มีประสิทธิภาพเกินไปสำหรับฉัน เนื่องจากไฟล์บันทึกมีขนาดใหญ่มาก

ในเน็ต ฉันพบความเป็นไปได้ต่อไปนี้ ซึ่งได้ผลค่อนข้างมาก จนถึงตอนนี้ อย่างไรก็ตาม,

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

ตอนนี้ฉันพบปัญหาอื่นที่นั่น โดยได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันนับสตริงในรูปแบบ "Nachricht erhalten ("

ข้อความผิดพลาด:

System.ArgumentException: "Nachricht erhalten (" วิเคราะห์แล้ว - ไม่เพียงพอ ) - อักขระ


person Soeren3003    schedule 29.04.2020    source แหล่งที่มา


คำตอบ (1)


คุณต้องหลีกเลี่ยงสัญลักษณ์ ( เนื่องจากมี ฟังก์ชัน พิเศษในนิพจน์ทั่วไป:

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

หากคุณทำเช่นนี้โดยการป้อนข้อมูลของผู้ใช้โดยที่ผู้ใช้ไม่คุ้นเคยกับนิพจน์ทั่วไป คุณอาจใช้ IndexOf ในลูป while ได้ง่ายขึ้น โดยที่คุณสามารถใช้ดัชนีใหม่ที่พบในลูปสุดท้ายต่อไป ซึ่งอาจมีประสิทธิภาพดีกว่านิพจน์ทั่วไปเล็กน้อย ตัวอย่าง:

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
มีตัวละครอื่นอีกไหมฉันต้องหนี? ชอบ - . › ? - person Soeren3003; 29.04.2020
comment
@ Soeren3003 ดู: อักขระใดบ้างที่ต้องหลบหนีใน .NET Regex ? คุณสามารถใช้ Regex.Escape ได้เลย - person Pac0; 29.04.2020
comment
if you do this by user input -› ระวัง ไม่ควรดำเนินการนิพจน์ทั่วไปโดยพลการโดยไม่มีความระมัดระวัง (ใช้การหมดเวลาหรืออินสแตนซ์) ไม่ใช่เพียงเพื่อความเรียบง่ายสำหรับผู้ใช้เท่านั้น แต่ยังอาจเป็นช่องโหว่ได้ (ปฏิเสธการให้บริการ โปรดดูที่ [meziantou.net/regex-deny-of-service-redos.htm] และค้นหาการย้อนรอยหายนะ - person Pac0; 29.04.2020
comment
ขอขอบคุณข้อมูลและซอร์สโค้ด ฉันเปรียบเทียบทั้งสองครั้งแล้วและได้ผลลัพธ์ดังนี้: 00.0396874 วินาที ในขณะที่ และ 00.0039259 วินาที Regex อย่างไรก็ตาม ฉันตัดสินใจใช้ while loop เนื่องจากประสิทธิภาพเพียงพอสำหรับแอปพลิเคชันของฉัน - person Soeren3003; 29.04.2020
comment
@Soeren3003 จริงครับ มันขึ้นอยู่กับบริบทเล็กน้อย regex นั้นรวดเร็วสำหรับเหตุการณ์ไม่กี่ครั้ง แต่สำหรับไฟล์ขนาดใหญ่ที่มีหลายครั้ง มันจะช้าลงอย่างมากเนื่องจากการจัดสรรผลลัพธ์ (ซึ่งยังกินหน่วยความจำอย่างรวดเร็วอีกด้วย) - person 404; 29.04.2020