0Pricing
Coding Interview Prep · درس

تحليل السلاسل النصية وتنسيقها

استخدام SUBSTRING وتحديد الموضع والتقسيم وتحويل حالة الأحرف عبر اللهجات المختلفة

تحليل السلاسل النصية وتنسيقها درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

لماذا يُسأل عن دوال السلاسل النصية

البيانات الحقيقية فوضوية: أسماء كاملة تحتاج إلى تقسيم، ونطاقات بريد إلكتروني تحتاج إلى استخراج، ورموز مضمّنة داخل المعرّفات، وحالة أحرف غير متسقة. يستخدم المحاورون معالجة السلاسل النصية لمعرفة ما إذا كنت قادرًا على تنظيف النص وإعادة تشكيله دون تصديره إلى برنامج نصي.

وكما هي الحال مع التواريخ، فإن هذه الدوال موحّدة توحيدًا محدودًا فقط، ولذلك يتمثل الهدف في معرفة المفهوم والصيغ الشائعة المختلفة.

  • استخراج جزء من النص وتحديد موضعه
  • الربط
  • التقسيم والاستبدال
  • تحويل حالة الأحرف وإزالة المسافات الزائدة

SUBSTRING وتحديد الموضع

تُعد الصيغة SUBSTRING(s FROM start FOR length) الصيغة القياسية في SQL؛ كما تقبل معظم المحركات SUBSTRING(s, start, length). وتبدأ مواضع السلاسل من 1، وهي مشكلة شائعة مرتبطة بالفرق بين الفهرسة التي تبدأ من الصفر في اللغات البرمجية والفهرسة هنا.

تبحث POSITION(sub IN s) (أو STRPOS/CHARINDEX) عن موضع بداية السلسلة الفرعية، وتعيد القيمة 0 إذا لم تجدها.

SELECT
  SUBSTRING('INV-2024-042' FROM 5 FOR 4) AS year,   -- '2024'
  POSITION('-' IN 'INV-2024-042')        AS first_dash; -- 4

استخراج نطاق البريد الإلكتروني

هذا مثال تطبيقي أساسي. ابحث عن الرمز @، ثم خذ كل ما يأتي بعده. ويُعد الجمع بين POSITION وSUBSTRING أسلوبًا قابلًا للنقل بين الأنظمة.

وفي PostgreSQL، يمكنك أيضًا استخدام SPLIT_PART(email, '@', 2)، وهي صيغة أوضح وتستحق الذكر باعتبارها الإجابة الاصطلاحية.

-- Portable
SELECT SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM users;

-- Postgres idiom
SELECT SPLIT_PART(email, '@', 2) AS domain FROM users;

الربط بين اللهجات المختلفة

يتأثر ربط السلاسل النصية باللهجة المستخدمة، ويتوقع المحاورون منك معرفة الصيغ المختلفة.

  • معيار SQL وPostgres وOracle: العامل ||.
  • MySQL: الدالة CONCAT(a, b, c) (يُستخدم العامل || افتراضيًا للدلالة على OR المنطقي).
  • SQL Server: العامل + للسلاسل النصية، أو الدالة CONCAT().

تتعامل CONCAT() مع NULL على أنه سلسلة نصية فارغة، بينما تجعل || و+ النتيجة بأكملها NULL عادةً إذا كانت أي قيمة من القيم NULL، مما قد يؤدي إلى أخطاء دقيقة.

-- Postgres
SELECT first_name || ' ' || last_name AS full_name FROM people;

-- MySQL / SQL Server
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM people;

مشكلة الربط مع NULL

بالعودة إلى المشهد السابق: إذا كانت قيمة last_name هي NULL، فإن first_name || ' ' || last_name تعيد NULL في Postgres، مما يؤدي إلى فقدان الاسم بالكامل.

والحل الوقائي هو استخدام COALESCE مع الأجزاء التي قد تكون NULL، أو استخدام CONCAT_WS (الربط مع فاصل)، التي تتجاهل قيم NULL وتضع الفاصل بين القيم الموجودة فقط.

-- Safe in Postgres / MySQL
SELECT CONCAT_WS(' ', first_name, last_name) AS full_name FROM people;

-- Or guard each part
SELECT first_name || ' ' || COALESCE(last_name, '') FROM people;

تقسيم السلاسل النصية

إن عبارة «استخرج الجزء الثالث من رمز مكوّن من مقاطع تفصل بينها شرطات» تختبر مهارة التقسيم. تعيد SPLIT_PART(s, delim, n) في PostgreSQL الجزء رقم n مباشرة، وهي الأداة الأبسط.

ولا تحتوي MySQL على دالة تقسيم مباشرة؛ والأسلوب الاصطلاحي هو استخدام SUBSTRING_INDEX المتداخل: خذ أول n أجزاء، ثم خذ الجزء الأخير منها.

-- Postgres
SELECT SPLIT_PART('a-b-c-d', '-', 3); -- 'c'

-- MySQL: third part of a-b-c-d
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a-b-c-d', '-', 3), '-', -1); -- 'c'

الاستبدال وإزالة المسافات والحشو

هذه عمليات التنظيف التي يتوقع المحاورون أن تعرفها مباشرة:

  • تستبدل REPLACE(s, from, to) جميع التكرارات.
  • تزيل TRIM(s) المسافات في البداية والنهاية؛ وتزيل TRIM(BOTH 'x' FROM s) حرفًا محددًا.
  • تضيف LPAD(s, len, ch) / RPAD حشوًا للوصول إلى عرض ثابت، وهو مفيد لإضافة أصفار بادئة إلى المعرّفات.
SELECT
  REPLACE('555.123.4567', '.', '-') AS phone,   -- 555-123-4567
  TRIM('   hello   ')               AS clean,   -- 'hello'
  LPAD('42', 6, '0')                AS padded;   -- '000042'

تحويل حالة الأحرف والطول

يُعد توحيد حالة الأحرف ضروريًا قبل مقارنة النصوص أو تجميعها. وتُعد UPPER وLOWER شائعتين في جميع الأنظمة؛ بينما تحول INITCAP (في Postgres وOracle) الكلمات إلى حالة العنوان.

تعيد LENGTH(s) عدد الأحرف في معظم المحركات، لكن انتبه: تستخدم SQL Server الدالة LEN()، وفي بعض الإعدادات تحسب LENGTH عدد البايتات للنصوص متعددة البايتات. اذكر هذا التفصيل عند التعامل مع بيانات غير ASCII.

SELECT
  LOWER(email)        AS email_norm,
  INITCAP(city)       AS city_pretty,  -- Postgres
  LENGTH(description)  AS chars
FROM places;

مطابقة الأنماط بما يتجاوز LIKE

عندما لا تكون LIKE قوية بما يكفي، يحب المحاورون أن يروا وعيًا بالتعابير النمطية. توفر PostgreSQL العامل ~ والدالتين REGEXP_REPLACE وREGEXP_MATCHES؛ بينما توفر MySQL الدالتين REGEXP وREGEXP_SUBSTR.

مثال: الاحتفاظ بالأرقام فقط من سلسلة تحتوي على رقم هاتف. تجعل التعابير النمطية هذه العملية سطرًا واحدًا بدلًا من سلسلة من استدعاءات REPLACE.

-- Postgres: strip non-digits
SELECT REGEXP_REPLACE('(555) 123-4567', '[^0-9]', '', 'g')
  AS digits; -- '5551234567'

مثال أعمق: توحيد الأسماء وإزالة التكرارات

هذه مهمة تنظيف تجمع عدة خطوات. افترض أن الأسماء تصل مع مسافات زائدة وحالة أحرف مختلطة، مما يؤدي إلى تكرارات زائفة. وحّدها أولًا، ثم نفّذ التجميع.

أزل المسافات الزائدة، وادمج المسافات الداخلية المتتالية باستخدام تعبير نمطي، وحوّل الأحرف إلى lowercase قبل حساب القيم المميزة. وهذا تحديدًا نوع التفكير متعدد الخطوات الذي يقدّره المحاورون.

SELECT
  LOWER(REGEXP_REPLACE(TRIM(name), '\s+', ' ', 'g')) AS norm_name,
  COUNT(*) AS occurrences
FROM contacts
GROUP BY 1
ORDER BY occurrences DESC;

تحويل السلاسل النصية إلى أرقام وتواريخ

غالبًا ما تحتوي أعمدة السلاسل النصية على قيم ينبغي أن تكون أرقامًا أو تواريخ. تعمل CAST(s AS INTEGER) أو الصيغة المختصرة في Postgres، وهي s::int، على التحويل، لكنها تفشل عند وجود إدخال غير صالح.

وبالنسبة إلى التواريخ، تحلّل TO_DATE(s, 'YYYY-MM-DD') (في Postgres وOracle) النص باستخدام قناع تنسيق صريح، وهو الأسلوب الأكثر أمانًا لأنه يزيل الالتباس حول ترتيب اليوم والشهر.

SELECT
  CAST(qty_text AS INTEGER)            AS qty,
  TO_DATE(order_str, 'DD/MM/YYYY')     AS order_date
FROM staging;

اختبار سريع

حلّل سلوك NULL عند ربط السلاسل النصية.

مراجعة: تحليل السلاسل النصية وتنسيقها

النقاط الأساسية التي ينبغي تذكّرها للمقابلة:

  • تبدأ مواضع السلاسل من 1؛ ويتيح الجمع بين SUBSTRING وPOSITION الاستخراج حسب الموضع.
  • اربط باستخدام || في Postgres، أو CONCAT في MySQL، أو + في SQL Server، وتذكّر انتقال NULL؛ وفضّل استخدام CONCAT_WS.
  • قسّم باستخدام SPLIT_PART في Postgres أو SUBSTRING_INDEX المتداخل في MySQL.
  • تعمل REPLACE وTRIM وLPAD وUPPER/LOWER على تنظيف النص وتوحيده؛ بينما تتولى التعابير النمطية الحالات المعقدة.
  • وحّد حالة الأحرف والمسافات البيضاء قبل التجميع لتجنب التكرارات الزائفة.

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

هل درس «تحليل السلاسل النصية وتنسيقها» مجاني؟

نعم — نص درس «تحليل السلاسل النصية وتنسيقها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «تحليل السلاسل النصية وتنسيقها»؟

استخدام SUBSTRING وتحديد الموضع والتقسيم وتحويل حالة الأحرف عبر اللهجات المختلفة تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟

لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «تحليل السلاسل النصية وتنسيقها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟

نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الحساب باستخدام التواريخ والفواصل الزمنية
  2. اقتطاع التواريخ وتجميعها في فئات
  3. تحليل السلاسل النصية وتنسيقها
  4. المناطق الزمنية والطوابع الزمنية
← العودة إلى Coding Interview Prep