ตัวพิมพ์เล็กและใหญ่ 'มี (สตริง)'


2907

มีวิธีที่จะทำให้ผลตอบแทนต่อไปนี้เป็นจริงหรือไม่?

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

มีไม่ดูเหมือนจะเกินที่ช่วยให้ผมตั้งค่าความไวกรณี .. ขณะนี้ฉันพิมพ์ใหญ่พวกเขาทั้งสอง แต่นั่นเป็นเพียงโง่ (โดยที่ฉันหมายถึงi18nปัญหาที่มาพร้อมกับการขึ้นและลงท่อ)

อัพเดท
คำถามนี้เก่าแก่และตั้งแต่นั้นมาฉันก็รู้ว่าฉันขอคำตอบง่ายๆสำหรับหัวข้อที่กว้างใหญ่และยากมากถ้าคุณสนใจตรวจสอบอย่างเต็มที่
สำหรับกรณีส่วนใหญ่ในภาษาพูดเดียวรหัสภาษาอังกฤษจะใช้คำตอบนี้เพียงพอ ฉันสงสัยเพราะคนส่วนใหญ่ที่มาที่นี่ตกอยู่ในหมวดหมู่นี้นี่เป็นคำตอบที่ได้รับความนิยมมากที่สุด อย่างไรก็ตามคำตอบ
นี้ทำให้เกิดปัญหาโดยธรรมชาติที่เราไม่สามารถเปรียบเทียบตัวพิมพ์เล็กและตัวพิมพ์เล็กจนกว่าเราจะรู้ว่าข้อความทั้งสองเป็นวัฒนธรรมเดียวกันและเรารู้ว่าวัฒนธรรมนั้นคืออะไร นี่อาจเป็นคำตอบที่ได้รับความนิยมน้อยกว่า แต่ฉันคิดว่ามันถูกต้องมากกว่าและนั่นเป็นสาเหตุที่ฉันทำเครื่องหมายว่าเป็นเช่นนั้น

คำตอบ:


1398

เพื่อทดสอบว่าสตริงparagraphมีสตริงword(ขอบคุณ @QuarterMeister)

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

ในกรณีที่cultureเป็นตัวอย่างของCultureInfoการอธิบายภาษาที่ข้อความที่ถูกเขียนใน

การแก้ปัญหานี้มีความโปร่งใสเกี่ยวกับความหมายของกรณีความไม่รู้สึกซึ่งเป็นภาษาที่ขึ้นอยู่กับ ตัวอย่างเช่นภาษาอังกฤษใช้อักขระIและตัวอักษรตัวiพิมพ์ใหญ่และตัวพิมพ์เล็กในขณะที่ภาษาตุรกีใช้อักขระเหล่านี้สำหรับตัวอักษรที่สิบเอ็ดและสิบสองของตัวอักษรยาว 29 ตัว เวอร์ชั่นตัวพิมพ์ใหญ่ของตุรกีคือ 'i' เป็นตัวละครที่ไม่คุ้นเคย 'İ'

ดังนั้นสตริงtinและTINเป็นคำเดียวกันในภาษาอังกฤษแต่คำพูดที่แตกต่างกันในตุรกี ดังที่ฉันเข้าใจแล้วหนึ่งในนั้นหมายถึง 'วิญญาณ' และอีกอันหนึ่งคือคำเลียนเสียงธรรมชาติ (เติร์กโปรดแก้ไขฉันหากฉันผิดหรือแนะนำตัวอย่างที่ดีกว่า)

เพื่อสรุปคุณเท่านั้นที่สามารถตอบคำถาม 'เหล่านี้เป็นสองสายเดียวกัน แต่ในกรณีที่แตกต่างกันถ้าคุณรู้ว่าสิ่งที่ภาษาข้อความที่อยู่ใน หากคุณไม่รู้คุณจะต้องถ่อ เมื่อพิจารณาจากซอฟต์แวร์ภาษาอังกฤษของเจ้าโลกคุณควรใช้วิธีนี้CultureInfo.InvariantCultureเพราะมันจะผิดในแบบที่คุ้นเคย


67
ทำไมculture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0ล่ะ ที่ใช้วัฒนธรรมที่เหมาะสมและไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่มันไม่ได้จัดสรรสตริงตัวพิมพ์เล็กชั่วคราวและหลีกเลี่ยงคำถามที่จะแปลงเป็นตัวพิมพ์เล็กและการเปรียบเทียบนั้นจะเหมือนกับการเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เสมอ
Quartermeister

9
โซลูชันนี้ยังสร้างมลพิษให้โดยไม่จำเป็นโดยการจัดสรรหน่วยความจำสำหรับสิ่งที่ควรเป็นฟังก์ชันการค้นหา
JaredPar

15
การเปรียบเทียบกับ ToLower () จะให้ผลลัพธ์ที่แตกต่างจากตัวพิมพ์เล็กและตัวพิมพ์เล็กกรณีเมื่อตัวอักษรสองตัวที่แตกต่างกันมีตัวอักษรตัวเล็กเหมือนกัน ตัวอย่างเช่นการเรียก ToLower () บน U + 0398 "Theta ตัวพิมพ์ใหญ่กรีก" หรือ U + 03F4 "สัญลักษณ์ตัวพิมพ์ใหญ่ Theta กรีก" ให้ผลลัพธ์เป็น U + 03B8, "Greek Small Letter Theta" แต่ตัวอักษรตัวใหญ่ถือว่าแตกต่างกัน โซลูชันทั้งสองพิจารณาตัวอักษรพิมพ์เล็กที่มีตัวพิมพ์ใหญ่ต่างกันเช่น U + 0073 "ตัวอักษรละตินตัวเล็ก S" และ U + 017F "ตัวอักษรละตินตัวพิมพ์เล็กยาว S" ดังนั้นโซลูชัน IndexOf จึงมีความสอดคล้องกันมากกว่า
Quartermeister

3
@Quartermeister - และ BTW ฉันเชื่อว่า. NET 2 และ. NET4 ทำงานในลักษณะนี้แตกต่างกันเนื่องจาก. NET 4 ใช้ NORM_LINGUISTIC_CASING เสมอในขณะที่. NET 2 ไม่ได้ (สถานะนี้ปรากฏขึ้นพร้อมกับ Windows Vista)
Simon Mourier

10
ทำไมคุณไม่เขียน "ddddfg" .IndexOf ("Df", StringComparison.OrdinalIgnoreCase)
เฉิน

2713

คุณสามารถใช้วิธี String.IndexOfและส่งผ่านStringComparison.OrdinalIgnoreCaseเป็นประเภทการค้นหาที่จะใช้:

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

ที่ดียิ่งขึ้นคือการกำหนดวิธีการขยายใหม่สำหรับสตริง:

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

โปรดทราบว่าการเผยแพร่ null ?.นั้นมีให้ตั้งแต่ C # 6.0 (VS 2015) สำหรับรุ่นที่เก่ากว่าใช้

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

การใช้:

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

3
วิธีการขยายสตริงที่ยอดเยี่ยม! ฉันได้แก้ไขของฉันเพื่อตรวจสอบว่าซอร์สสตริงนั้นไม่เป็นโมฆะเพื่อป้องกันข้อผิดพลาดการอ้างอิงวัตถุใด ๆ เกิดขึ้นเมื่อดำเนินการ. Inexex ()
Richard Pursehouse

8
สิ่งนี้ให้คำตอบเดียวparagraph.ToLower(culture).Contains(word.ToLower(culture))กับCultureInfo.InvariantCultureและมันไม่ได้แก้ปัญหาการแปล ทำไมสิ่งที่ซับซ้อนเกิน? stackoverflow.com/a/15464440/284795
พันเอก Panic

60
@ColonelPanic ToLowerเวอร์ชันนี้ประกอบด้วยการจัดสรร 2 รายการซึ่งไม่จำเป็นในการดำเนินการเปรียบเทียบ / การค้นหา ทำไมจัดสรรโดยไม่จำเป็นในสถานการณ์ที่ไม่ต้องการ
JaredPar

4
@ Seabiscuit ที่ใช้งานไม่ได้เพราะstringเป็นเพราะIEnumerable<char>เหตุนี้คุณจึงไม่สามารถใช้มันเพื่อค้นหา substrings
JaredPar

6
คำเตือน: ค่าเริ่มต้นสำหรับstring.IndexOf(string)คือการใช้วัฒนธรรมปัจจุบันในขณะที่ค่าเริ่มต้นสำหรับstring.Contains(string)คือการใช้ลำดับเปรียบเทียบ อย่างที่เราทราบกันดีว่าอดีตสามารถเปลี่ยนแปลงได้คือการเลือกใช้งานที่นานเกินไปในขณะที่ตัวหลังไม่สามารถเปลี่ยนแปลงได้ ผลที่ตามมาของความไม่สอดคล้องนี้คือตัวอย่างโค้ดต่อไปนี้:Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; string self = "Waldstrasse"; string value = "straße"; Console.WriteLine(self.Contains(value));/* False */ Console.WriteLine(self.IndexOf(value) >= 0);/* True */
Jeppe Stig Nielsen

231

คุณสามารถใช้IndexOf()สิ่งนี้:

string title = "STRING";

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

เนื่องจาก 0 (ศูนย์) สามารถเป็นดัชนีคุณตรวจสอบกับ -1

MSDN

ตำแหน่งดัชนีตามศูนย์ถ้าพบสตริงนั้นหรือ -1 ถ้าไม่ใช่ ถ้า value เป็น String.Empty ค่าส่งคืนจะเป็น 0


148

โซลูชันทางเลือกโดยใช้ Regex:

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

6
ความคิดที่ดีนอกจากนี้เรายังมีชุดค่าผสม bitwise จำนวนมากใน RegexOptions เช่นเดียวRegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant;กับใครก็ได้ถ้ามีความช่วยเหลือ
Saravanan

7
ต้องบอกว่าฉันชอบวิธีนี้มากกว่าแม้ว่าจะใช้ IsMatch เพื่อความเรียบร้อย
wonea

31
มีอะไรที่แย่กว่านั้นเนื่องจากสตริงการค้นหาถูกตีความว่าเป็น regex ตัวอักษรเครื่องหมายวรรคตอนจำนวนมากจะทำให้ผลลัพธ์ไม่ถูกต้อง (หรือทริกเกอร์ข้อยกเว้นเนื่องจากนิพจน์ไม่ถูกต้อง) ลองค้นหาใน"." "This is a sample string that doesn't contain the search string"หรือลองค้นหา"(invalid"ด้วยว่า
cHao

17
@cHao: ในกรณีนั้นRegex.Escapeสามารถช่วยได้ Regex ยังดูเหมือนไม่จำเป็นเมื่อIndexOf/ ส่วนขยายContainsนั้นง่าย (และชัดเจนยิ่งขึ้น)
Dan Mangiarelli

6
โปรดทราบว่าฉันไม่ได้หมายความว่าโซลูชัน Regex นี้เป็นวิธีที่ดีที่สุด ฉันแค่เพิ่มรายการคำตอบสำหรับคำถามที่โพสต์ต้นฉบับ "มีวิธีที่จะทำให้การส่งคืนดังต่อไปนี้เป็นจริงหรือไม่"
เจด

79

คุณสามารถเพิ่มหรือลดขนาดสตริงได้เสมอ

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

อ๊ะเพิ่งเห็นว่าบิตสุดท้าย การเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์เล็ก*อาจจะ*ทำแบบเดียวกันอยู่ดีและหากประสิทธิภาพไม่ใช่ปัญหาฉันไม่เห็นปัญหาในการสร้างสำเนาตัวพิมพ์ใหญ่และเปรียบเทียบสิ่งเหล่านั้น ฉันสาบานได้ว่าเคยเห็นการเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หนึ่งครั้ง ...


122
ค้นหา "Turkey test" :)
Jon Skeet

7
ในประเทศฝรั่งเศสบางแห่งตัวอักษรตัวพิมพ์ใหญ่ไม่มีเครื่องหมายกำกับดังนั้น ToUpper () อาจไม่ดีไปกว่า ToLower () ฉันจะบอกว่าใช้เครื่องมือที่เหมาะสมหากพวกเขามี - เปรียบเทียบเล็กและใหญ่
Blair Conrad

5
อย่าใช้ ToUpper หรือ ToLower และทำในสิ่งที่จอนสกีตกล่าวว่า
ปีเตอร์ Gfader

14
เพิ่งเห็นสิ่งนี้อีกครั้งหลังจากสองปีและ downvote ใหม่ ... อย่างไรก็ตามฉันยอมรับว่ามีวิธีที่ดีกว่าในการเปรียบเทียบสตริง อย่างไรก็ตามไม่ใช่ว่าทุกโปรแกรมจะมีการแปลเป็นภาษาท้องถิ่น เนื่องจากฉันแทบจะไม่สามารถคาดหวังเครดิตสำหรับคำแนะนำที่ดีที่สุดสำหรับแอพที่ถูกทิ้ง ... ฉันกำลังดำเนินการต่อ: D
Ed S.

8
กำลังค้นหา "ไก่งวงทดสอบ" เหมือนกับการค้นหา "TURKEY TEST" หรือไม่
JackAce

55

. NET Core 2.0+ เท่านั้น (ณ ตอนนี้)

.NET Core มีวิธีการสองอย่างที่จะจัดการกับสิ่งนี้ตั้งแต่รุ่น 2.0:

  • String.Contains (Char, StringComparison )
  • String.Contains (String, StringComparison )

ตัวอย่าง:

"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);

ทันเวลาพวกเขาอาจเข้าสู่. NET Standard และจากที่นั่นไปสู่การใช้งานอื่น ๆ ทั้งหมดของ Base Class Library


1
ตอนนี้มีให้ใน. NET Standard 2.1
Paweł Bulwan

52

ปัญหาหนึ่งที่มีคำตอบคือมันจะโยนข้อยกเว้นถ้าสตริงเป็นโมฆะ คุณสามารถเพิ่มสิ่งนั้นเป็นเช็คเพื่อที่จะไม่:

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;
} 

8
ถ้า toCheck เป็นสตริงว่างมันจะต้องส่งกลับค่าจริงตามเอกสารประกอบประกอบด้วย: "จริงถ้าพารามิเตอร์ค่าเกิดขึ้นภายในสตริงนี้หรือถ้าค่าเป็นสตริงว่าง (" "); มิฉะนั้นเป็นเท็จ"
amurra

3
จากความคิดเห็นของ amurra ด้านบนไม่จำเป็นต้องแก้ไขรหัสที่แนะนำใช่ไหม และสิ่งนี้ไม่ควรถูกเพิ่มเข้าไปในคำตอบที่ยอมรับดังนั้นคำตอบที่ดีที่สุดคืออันดับแรก
David White

13
ทีนี้สิ่งนี้จะกลับมาจริงถ้าแหล่งที่มาเป็นสตริงว่างหรือโมฆะไม่ว่าจะเป็น toCheck ใด มันไม่ถูกต้อง นอกจากนี้ IndexOf ก็จะส่งกลับค่าจริงถ้า toCheck เป็นสตริงว่างเปล่าและแหล่งที่มานั้นไม่เป็นโมฆะ สิ่งที่จำเป็นในที่นี้คือการตรวจสอบค่าว่าง ฉันแนะนำถ้า (แหล่ง == null || ค่า == null) คืนเท็จ;
โคลิน

2
แหล่งที่มาไม่สามารถเป็นโมฆะ
ลูคัส

1
if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(toCheck);
Kyle Delaney

35

StringExtension class เป็นทางไปข้างหน้าฉันได้รวมโพสต์สองสามข้อด้านบนเพื่อให้ตัวอย่างรหัสที่สมบูรณ์:

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;
    }
}

ทำไมคุณถึงปล่อยให้อีกชั้นหนึ่งของนามธรรมมากกว่าStringComparison?
l

35

นี่สะอาดและเรียบง่าย

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

31
นี้จะตรงกับรูปแบบแม้ว่า ในตัวอย่างของคุณถ้าfileNamestrมีอักขระ regex พิเศษใด ๆ (เช่น*, +, .ฯลฯ ) แล้วคุณจะอยู่ในสำหรับค่อนข้างแปลกใจ วิธีเดียวที่จะทำให้การทำงานการแก้ปัญหานี้เหมือนที่เหมาะสมContainsฟังก์ชั่นที่จะหลบหนีด้วยการทำfileNamestr Regex.Escape(fileNamestr)
XåpplI'-I0llwlg'I -

นอกจากนี้การแยกวิเคราะห์และการจับคู่ regex นั้นมีความเข้มข้นของทรัพยากรมากกว่าการเปรียบเทียบแบบตัวพิมพ์เล็กและใหญ่
phuclv

29

OrdinalIgnoreCase, CurrentCultureIgnoreCase หรือ InvariantCultureIgnoreCase?

เนื่องจากนี่หายไปนี่คือคำแนะนำบางประการเกี่ยวกับเวลาที่จะใช้:

Dos

  • ใช้StringComparison.OrdinalIgnoreCaseสำหรับการเปรียบเทียบเป็นค่าเริ่มต้นที่ปลอดภัยสำหรับการจับคู่สตริงที่ไม่เชื่อเรื่องพระเจ้า
  • ใช้StringComparison.OrdinalIgnoreCaseการเปรียบเทียบเพื่อเพิ่มความเร็ว
  • ใช้StringComparison.CurrentCulture-basedการทำงานของสตริงเมื่อแสดงผลลัพธ์ไปยังผู้ใช้
  • สลับการใช้งานการดำเนินงานสตริงปัจจุบันตามวัฒนธรรมที่ไม่เปลี่ยนแปลงเพื่อใช้ที่ไม่ใช่ภาษาStringComparison.Ordinalหรือ StringComparison.OrdinalIgnoreCaseเมื่อการเปรียบเทียบนั้น
    ไม่เกี่ยวข้องกับภาษา (ตัวอย่างเช่นสัญลักษณ์)
  • ใช้ToUpperInvariantแทนที่จะเป็นToLowerInvariantเมื่อ normalizing สตริงสำหรับการเปรียบเทียบ

Don'ts

  • ใช้โอเวอร์โหลดสำหรับการดำเนินการกับสตริงที่ไม่ได้ระบุกลไกการเปรียบเทียบสตริงโดยชัดแจ้งหรือโดยปริยาย
  • ใช้StringComparison.InvariantCulture-based
    การดำเนินงานสตริงในกรณีส่วนใหญ่; หนึ่งในข้อยกเว้นบางประการจะยัง
    คงมีความหมายทางภาษา แต่ข้อมูลที่ไม่เชื่อเรื่องพระเจ้าเกี่ยวกับวัฒนธรรม

ตามกฎเหล่านี้คุณควรใช้:

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

ในขณะที่ [YourDecision] ขึ้นอยู่กับคำแนะนำจากด้านบน

ลิงก์ของแหล่งที่มา: http://msdn.microsoft.com/en-us/library/ms973919.aspx


ถ้าคุณรู้ว่าคุณจะได้รับสายภาษาอังกฤษอยู่เสมอ จะใช้อันไหนดี?
BKSpurgeon

1
@BKSpurgeon ฉันจะใช้ OrdinalIgnoreCase หากกรณีไม่สำคัญ
Fabian Bigler

20

นี่คือทางออกที่ง่ายที่สุด

  1. โดยดัชนีของ

    string title = "STRING";
    
    if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
    {
        // contains 
    }
  2. โดยการเปลี่ยนเคส

    string title = "STRING";
    
    bool contains = title.ToLower().Contains("string")
  3. โดย Regex

    Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);

11

ฉันรู้ว่านี่ไม่ใช่ C # แต่ในกรอบงาน (VB.NET) มีฟังก์ชั่นดังกล่าวอยู่แล้ว

Dim str As String = "UPPERlower"
Dim b As Boolean = InStr(str, "UpperLower")

ตัวแปร C #:

string myString = "Hello World";
bool contains = Microsoft.VisualBasic.Strings.InStr(myString, "world");

11

InStrวิธีจาก VisualBasic การชุมนุมที่ดีที่สุดคือถ้าคุณมีความกังวลเกี่ยวกับความเป็นสากล (หรือคุณอาจจะ reimplement มัน) การดูที่ dotNeetPeek แสดงให้เห็นว่าไม่เพียง แต่จะคำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์เล็กเท่านั้น แต่ยังรวมถึงตัวอักษรคานาและตัวอักษรเต็มความกว้างครึ่งตัว (ส่วนใหญ่เกี่ยวข้องกับภาษาเอเชียแม้ว่าจะมีตัวอักษรโรมันแบบเต็มความกว้างเช่นกัน) ) ฉันกำลังข้ามรายละเอียดบางอย่าง แต่ลองดูวิธีส่วนตัวInternalInStrText:

private static int InternalInStrText(int lStartPos, string sSrc, string sFind)
{
  int num = sSrc == null ? 0 : sSrc.Length;
  if (lStartPos > num || num == 0)
    return -1;
  if (sFind == null || sFind.Length == 0)
    return lStartPos;
  else
    return Utils.GetCultureInfo().CompareInfo.IndexOf(sSrc, sFind, lStartPos, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth);
}

11

แบบนี้:

string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
    Console.WriteLine("yes");
}

3
นี่ไม่ใช่เฉพาะวัฒนธรรมและอาจล้มเหลวในบางกรณี culture.CompareInfo.IndexOf (ย่อหน้า, คำ, CompareOptions.IgnoreCase) ควรใช้
hikalkan


8

ใช้สิ่งนี้:

string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);

26
ถามที่กำลังมองหาไม่ได้Contains Compare
DuckMaestro

@DuckMaestro คำตอบที่ได้รับการยอมรับคือการใช้กับContains IndexOfดังนั้นวิธีนี้จึงมีประโยชน์ไม่แพ้กัน! ตัวอย่างรหัส C # ในหน้านี้ใช้ string.Compare () ทางเลือกของทีม SharePoint นั่นคือ!
Raven vulcan

6

นี่ค่อนข้างคล้ายกับตัวอย่างอื่น ๆ ที่นี่ แต่ฉันตัดสินใจที่จะทำให้ enum เป็นบูลง่ายขึ้นหลักเพราะทางเลือกอื่นมักไม่ต้องการ นี่คือตัวอย่างของฉัน:

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

และการใช้งานเป็นสิ่งที่ชอบ:

if( "main String substring".Contains("SUBSTRING", true) )
....

6

การใช้ RegEx เป็นวิธีที่ตรงไปตรงมาเพื่อทำสิ่งนี้:

Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);

4
คำตอบของคุณตรงกับ guptat59 แต่ตามที่ระบุไว้ในคำตอบของเขาสิ่งนี้จะตรงกับนิพจน์ทั่วไปดังนั้นหากสตริงที่คุณกำลังทดสอบมีอักขระพิเศษ regex จะไม่ให้ผลลัพธ์ที่ต้องการ
Casey

2
นี่เป็นสำเนาของคำตอบนี้และตรงประเด็นเดียวกันตามที่ระบุไว้ในคำตอบนั้น
Liam

ตกลง ศึกษานิพจน์ทั่วไป
Jared

5

เพื่อสร้างคำตอบที่นี่คุณสามารถสร้างวิธีการขยายสตริงเพื่อทำให้ใช้งานง่ายขึ้น:

    public static bool ContainsIgnoreCase(this string paragraph, string word)
    {
        return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
    }

1
การสมมติย่อหน้าและคำพูดของคุณจะอยู่ในระหว่างการให้บริการ
Boris Callens

3
เพื่อหลีกเลี่ยงปัญหาเกี่ยวกับการบังคับให้วัฒนธรรมเข้าสู่สหรัฐอเมริกาให้ใช้return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;แทน
AndrewWhalan

3

หากคุณต้องการตรวจสอบว่าสตริงที่ส่งผ่านของคุณอยู่ในสตริงหรือไม่นั้นมีวิธีการง่ายๆ

string yourStringForCheck= "abc";
string stringInWhichWeCheck= "Test abc abc";

bool isContained = stringInWhichWeCheck.ToLower().IndexOf(yourStringForCheck.ToLower()) > -1;

ค่าบูลีนนี้จะส่งคืนหากสตริงมีอยู่หรือไม่





2

เคล็ดลับที่นี่คือการค้นหาสตริงโดยไม่สนใจขนาดตัวพิมพ์ แต่เพื่อให้เหมือนกันทั้งหมด (ด้วยตัวพิมพ์เล็ก)

 var s="Factory Reset";
 var txt="reset";
 int first = s.IndexOf(txt, StringComparison.InvariantCultureIgnoreCase) + txt.Length;
 var subString = s.Substring(first - txt.Length, txt.Length);

ผลลัพธ์คือ "รีเซ็ต"


-1
public static class StringExtension
{
    #region Public Methods

    public static bool ExContains(this string fullText, string value)
    {
        return ExIndexOf(fullText, value) > -1;
    }

    public static bool ExEquals(this string text, string textToCompare)
    {
        return text.Equals(textToCompare, StringComparison.OrdinalIgnoreCase);
    }

    public static bool ExHasAllEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index]) == false) return false;
        return true;
    }

    public static bool ExHasEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index])) return true;
        return false;
    }

    public static bool ExHasNoEquals(this string text, params string[] textArgs)
    {
        return ExHasEquals(text, textArgs) == false;
    }

    public static bool ExHasNotAllEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index])) return false;
        return true;
    }

    /// <summary>
    /// Reports the zero-based index of the first occurrence of the specified string
    /// in the current System.String object using StringComparison.InvariantCultureIgnoreCase.
    /// A parameter specifies the type of search to use for the specified string.
    /// </summary>
    /// <param name="fullText">
    /// The string to search inside.
    /// </param>
    /// <param name="value">
    /// The string to seek.
    /// </param>
    /// <returns>
    /// The index position of the value parameter if that string is found, or -1 if it
    /// is not. If value is System.String.Empty, the return value is 0.
    /// </returns>
    /// <exception cref="ArgumentNullException">
    /// fullText or value is null.
    /// </exception>
    public static int ExIndexOf(this string fullText, string value)
    {
        return fullText.IndexOf(value, StringComparison.OrdinalIgnoreCase);
    }

    public static bool ExNotEquals(this string text, string textToCompare)
    {
        return ExEquals(text, textToCompare) == false;
    }

    #endregion Public Methods
}

-4

วิธีง่ายๆสำหรับมือใหม่:

title.ToLower().Contains("string");//of course "string" is lowercase.

ลงคะแนนเพียงเพราะไม่ถูกต้อง เกิดอะไรขึ้นถ้า title = StRiNg StRiNg! = string และ StRiNg! = STRING
berniefitz

ฉันผิดไป. แก้ไขคำตอบดังนี้ง่ายเกินไปง่าย ๆ : <br/> title.ToLower () มี ("string") // แน่นอน "string" เป็นตัวพิมพ์เล็ก
O Thạnh Ldt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.