Menu
flag Ar iconالعربيةdown icon

دوال النصوص في C#: Split وReplace وContains وIndexOf وTrim وJoin وغيرها

دوال String التي تستخدمها كل يوم في C#: Split بعدة فواصل وخيارات، وReplace، وContains والبحث غير الحساس لحالة الأحرف، وIndexOf وLastIndexOf، وStartsWith وEndsWith، وTrim، وToUpper وToLower، وPadLeft، وJoin، وConcat، وعكس النص.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

في System.String عشرات الدوال. تغطي هذه الصفحة الدوال التي تؤدي معظم العمل في الشيفرة الحقيقية، مع الخيارات والأفخاخ المهمة. قاعدة واحدة تنطبق عليها جميعًا: النصوص غير قابلة للتغيير، فكل دالة تعيد نصًا جديدًا (أو قيمة) وتترك الأصلي دون تغيير. s.Trim(); في سطر وحدها لا تفعل شيئًا؛ اكتب s = s.Trim();.

Split

تقسم Split النص إلى مصفوفة string[] عند كل فاصل:

المخرجات:

3
apple
banana
cherry
red/green/ blue/yellow
INFO/started/ready

لاحظ " blue": تقطع Split عند الفاصل بالضبط وتحتفظ بأي مسافات. خياران يعالجان التنظيفات الشائعة:

المخرجات:

5
4
c#|dotnet|linq
key=[Subject] value=[Re: Meeting: Friday]
3

يحذف RemoveEmptyEntries الأجزاء ذات الطول صفر لكن لا الأجزاء المكوّنة من مسافات فقط (نجا " " أعلاه). أضافت .NET 5 الخيار StringSplitOptions.TrimEntries، ويمكن الجمع بين الاثنين: tags.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) تعطي النتيجة النظيفة في استدعاء واحد. وتمرير null كفاصل يقسم عند أي مسافة بيضاء، وهي الطريقة المعتادة لتقسيم نص إلى كلمات.

التقسيم عند char واحد (Split(',')) لا يحتاج إلى مصفوفة. الأشكال التي تأخذ char مع خيارات، أو string واحدًا، موجودة منذ .NET Core 2.0؛ أما أشكال المصفوفات المستخدمة أعلاه فتعمل في كل مكان، بما في ذلك .NET Framework وUnity.

Replace

تستبدل Replace كل ظهور لمحرف أو لجزء نصي:

المخرجات:

5551234567
555.123.4567
Cats and dogs and CATS
dogs and dogs and dogs
dogs and cats and CATS
too many spaces

الشكل الذي يأخذ وسيط StringComparison متاح في .NET Core 2.0 وما بعده. وفي .NET Framework يتم الاستبدال غير الحساس لحالة الأحرف بـ Regex.Replace(text, Regex.Escape(find), replacement, RegexOptions.IgnoreCase). الاستبدال بـ "" هو طريقة حذف المحارف، وسلسلة عدة استدعاءات Replace مقبولة لبضعة استبدالات.

Contains وIndexOf وStartsWith وEndsWith

هذه الدوال تبحث. تجيب Contains بنعم أو لا؛ وتعيد IndexOf وLastIndexOf موضعًا، أو -1 حين لا تطابق؛ وتختبر StartsWith وEndsWith الطرفين.

المخرجات:

True
False
True
True
8
30
28
-1
16
False
True
True

كلها حساسة لحالة الأحرف افتراضيًا. توجد Contains(string, StringComparison) في .NET Core 2.1 وما بعده؛ والشكل IndexOf(...) >= 0 يعمل في كل إصدار، ولهذا تراه في الشيفرات الأقدم. تجد IndexOfAny(new[] { ',', ';' }) أول محرف من عدة محارف.

ملاحظة عن الثقافة: دون StringComparison تستخدم StartsWith وEndsWith وIndexOf(string) وCompareTo قواعد حساسة للثقافة، بينما تقارن Contains وReplace وIndexOf(char) ترتيبيًا (ordinal). تمرير StringComparison.Ordinal أو OrdinalIgnoreCase صراحة يزيل الالتباس، وتوصي به أدوات تحليل الشيفرة.

Trim وTrimStart وTrimEnd

تزيل Trim المسافات البيضاء (المسافات والجدولات والأسطر الجديدة) من الطرفين. وتزيل TrimStart وTrimEnd من طرف واحد. وإن أُعطيت محارف فإنها تزيلها بدلًا من ذلك:

المخرجات:

[ana@example.com]
[ana@example.com \n]
[  x]
SALE
7
path/to/dir
1,234.50

لا تمسّ Trim إلا الطرفين؛ وتبقى المسافات داخل النص. تعيد TrimStart('0') على "000" نصًا فارغًا، لذا اقرأ نصوص الأرقام بـ int.Parse بدل تجريد الأصفار يدويًا.

ToUpper وToLower

المخرجات:

MAYA LOPEZ
maya lopez
MAYA LOPEZ
Coffee

تتبع ToUpper وToLower الثقافة الحالية، ففي التركية تكون "i".ToUpper() حرف İ كبيرًا منقوطًا لا I. للمعرّفات والمفاتيح وأسماء الملفات استخدم ToUpperInvariant وToLowerInvariant. وللمقارنة استخدم StringComparison بدل تحويل حالة الأحرف أصلًا (راجع النصوص). ولتكبير أول حرف في كل كلمة توجد CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text)، مع أنها تترك الكلمات المكتوبة كلها بأحرف كبيرة كما هي.

PadLeft وPadRight

يضيف التبطين محارف حتى يبلغ النص عرضًا كليًا. وهو مفيد للمخرجات ذات العرض الثابت ولتبطين الرموز بالأصفار:

المخرجات:

000042
[Tea     ]
[     Tea]
Too long already
Espresso..  2.40
Latte.....  3.60
Mocha.....  3.95

تؤدي محاذاة الاستيفاء ({name,-10}) المهمة نفسها ضمن السطر.

Join وConcat

تضع string.Join فاصلًا بين عناصر أي مجموعة. وتضمّ string.Concat دون فاصل:

المخرجات:

Ana, Ben, Chloe
1 + 2 + 3
True
2026-09
AnaBenChloe
Ana, Ben and Chloe

Join هي الطريقة الصحيحة لبناء قائمة مفصولة: لا فاصل زائد في النهاية لإزالته، وتبني النتيجة في مرور واحد. تستدعي ToString() على كل عنصر، فتعمل مع الأرقام والكائنات أيضًا.

Reverse وInsert وRemove

لا توجد دالة string.Reverse تعيد نصًا. الطريقتان المعتادتان:

المخرجات:

desserts
desserts
True
2026/Q3-09
Hello
HelloWorld

تعيد word.Reverse() وحدها IEnumerable<char> لا نصًا؛ وطباعتها تُظهر اسم نوع. كلتا الطريقتين تعكس وحدات ترميز UTF-16، وهذا يكسر المحارف المكوّنة من وحدتين (معظم الرموز التعبيرية) والأحرف ذات علامات التشكيل المركّبة.

مرجع سريع

المهمةالدالة
التقسيم إلى أجزاءs.Split(',')، s.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries)
استبدال الكلs.Replace("a", "b")
الاحتواءs.Contains("x")، s.Contains("x", StringComparison.OrdinalIgnoreCase)
الموضعs.IndexOf("x")، s.LastIndexOf('x') (-1 عند الغياب)
يبدأ أو ينتهي بـs.StartsWith("x")، s.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)
إزالة المسافات من الطرفينs.Trim()، s.TrimStart()، s.TrimEnd()
تغيير حالة الأحرفs.ToUpper()، s.ToLowerInvariant()
التبطين إلى عرضs.PadLeft(6, '0')، s.PadRight(10)
ضمّ مجموعةstring.Join(", ", items)
جزء من نصs.Substring(start, length)
الإدراج أو الحذفs.Insert(i, "x")، s.Remove(i, count)
فحص null أو الفراغstring.IsNullOrWhiteSpace(s)

الأسئلة الشائعة

كيف أقسّم نصًا في C#؟

تعيد text.Split(',') مصفوفة string[] بالأجزاء الواقعة بين الفواصل. مرّر عدة فواصل كمصفوفة (Split(new[] { ',', ';' }))، وفاصلًا نصيًا بـ Split(new[] { ", " }, StringSplitOptions.None)، وStringSplitOptions.RemoveEmptyEntries لحذف الأجزاء الفارغة الناتجة عن فواصل مكرّرة. أضافت .NET 5 الخيار StringSplitOptions.TrimEntries لتشذيب كل جزء.

كيف أتحقق أن نصًا يحتوي على نص آخر مع تجاهل حالة الأحرف؟

في .NET Core 2.1 وما بعده: text.Contains("error", StringComparison.OrdinalIgnoreCase). وفي .NET Framework، التي تفتقر إلى هذا الشكل، استخدم text.IndexOf("error", StringComparison.OrdinalIgnoreCase) >= 0. تجنّب text.ToLower().Contains(...)، التي تحجز نسخة وقد تسيء التصرف في بعض الثقافات.

هل تغيّر String.Replace النص الأصلي في C#؟

لا. النصوص غير قابلة للتغيير، لذا تعيد Replace نصًا جديدًا استُبدل فيه كل ظهور وتترك الأصلي كما كان. اكتب s = s.Replace("old", "new");. تستبدل كل الظهورات لا الأول فقط؛ ولاستبدال الأول فقط اعثر عليه بـ IndexOf وأعد بناء النص، أو استدعِ Replace على مثيل Regex بعدد 1.

ماذا تعيد IndexOf إن لم يُعثر على النص؟

-1. أي نتيجة 0 أو أكبر هي موضع أول تطابق بدءًا من الصفر. افحص دائمًا -1 قبل استخدام النتيجة كفهرس، لأن Substring(-1) ترمي وSubstring(-1 + 1) تعيد النص كله بصمت. تعمل LastIndexOf بالطريقة نفسها، باحثة من النهاية.

كيف أعكس نصًا في C#؟

انسخه إلى مصفوفة محارف، واعكس المصفوفة، وابنِ نصًا جديدًا: char[] a = s.ToCharArray(); Array.Reverse(a); string r = new string(a);. ومع LINQ تفعل new string(s.Reverse().ToArray()) الشيء نفسه. كلاهما يعكس وحدات UTF-16، فقد تخرج الرموز التعبيرية وعلامات التشكيل المركّبة مشوّهة.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن