การแยกวิเคราะห์และจัดรูปแบบสตริง
เรียนรู้ SUBSTRING ตำแหน่ง การแยกข้อความ และการเปลี่ยนตัวพิมพ์ในแต่ละภาษาถิ่น
การแยกวิเคราะห์และจัดรูปแบบสตริง เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงมีการถามเรื่องฟังก์ชันจัดการข้อความ
ข้อมูลจริงมักไม่เป็นระเบียบ เช่น ชื่อเต็มที่ต้องแยกส่วน โดเมนอีเมลที่ต้องดึงออกมา รหัสที่ฝังอยู่ในรหัสประจำตัว และตัวพิมพ์ที่ไม่สม่ำเสมอ ผู้สัมภาษณ์ใช้การจัดการข้อความเพื่อดูว่าคุณสามารถทำความสะอาดและปรับรูปแบบข้อความได้หรือไม่ โดยไม่ต้องส่งข้อมูลออกไปประมวลผลด้วยสคริปต์
เช่นเดียวกับวันที่ ฟังก์ชันเหล่านี้มีมาตรฐานร่วมกันเพียงบางส่วน ดังนั้นเป้าหมายคือการเข้าใจ แนวคิด และรูปแบบที่ใช้กันทั่วไป
- การดึงข้อความบางส่วนและการค้นหาตำแหน่ง
- การต่อข้อความ
- การแยกและการแทนที่ข้อความ
- การแปลงตัวพิมพ์และการตัดช่องว่าง
SUBSTRING และตำแหน่ง
SUBSTRING(s FROM start FOR length) เป็นรูปแบบตามมาตรฐาน SQL ส่วนระบบส่วนใหญ่รองรับ SUBSTRING(s, start, length) ด้วย ตำแหน่งในข้อความเริ่มนับจาก 1 ซึ่งเป็นกับดักการเหลื่อมหนึ่งตำแหน่งแบบคลาสสิกสำหรับนักเขียนโปรแกรมที่คุ้นเคยกับภาษาซึ่งเริ่มนับจาก 0
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 ต่าง ๆ
การต่อข้อความขึ้นอยู่กับรูปแบบ SQL และผู้สัมภาษณ์คาดหวังให้คุณรู้จักรูปแบบต่าง ๆ
- มาตรฐาน SQL / PostgreSQL / 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 ใน PostgreSQL จะเป็น NULL ทำให้ชื่อทั้งหมดหายไป
วิธีแก้เพื่อป้องกันคือใช้ 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 (PostgreSQL/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'ตัวอย่างเชิงลึก: การทำชื่อให้เป็นรูปแบบมาตรฐานและการลบข้อมูลซ้ำ
นี่คืองานทำความสะอาดข้อมูลหลายขั้นตอน สมมติว่าชื่อที่เข้ามามีช่องว่างเกินและตัวพิมพ์ปะปนกันจนทำให้เกิดรายการซ้ำโดยผิดพลาด ให้ทำข้อมูลเป็นรูปแบบมาตรฐานก่อน แล้วจึงจัดกลุ่ม
ตัดช่องว่าง รวมช่องว่างภายในด้วยนิพจน์ทั่วไป และเปลี่ยนเป็นตัวพิมพ์เล็กก่อนนับค่าที่แตกต่างกัน นี่คือการใช้เหตุผลหลายขั้นตอนแบบที่ผู้สัมภาษณ์ให้ความสำคัญ
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) หรือรูปแบบย่อของ PostgreSQL อย่าง s::int ใช้แปลงค่าได้ แต่จะล้มเหลวเมื่อข้อมูลขาเข้าไม่ถูกต้อง
สำหรับวันที่ TO_DATE(s, 'YYYY-MM-DD') (PostgreSQL/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เพื่อดึงข้อความตามตำแหน่ง - ต่อข้อความด้วย
||(PostgreSQL),CONCAT(MySQL) หรือ+(SQL Server) และอย่าลืมเรื่องการส่งต่อค่า NULL โดยควรเลือกใช้CONCAT_WS - แยกข้อความด้วย
SPLIT_PART(PostgreSQL) หรือSUBSTRING_INDEXที่ซ้อนกัน (MySQL) REPLACE,TRIM,LPAD,UPPER/LOWERใช้ทำความสะอาดและทำให้ข้อมูลเป็นรูปแบบมาตรฐาน ส่วนนิพจน์ทั่วไปใช้จัดการกรณีที่ซับซ้อน- ทำให้ตัวพิมพ์และช่องว่างเป็นรูปแบบมาตรฐานก่อนจัดกลุ่ม เพื่อหลีกเลี่ยงรายการซ้ำโดยผิดพลาด
คำถามที่พบบ่อย
บทเรียน “การแยกวิเคราะห์และจัดรูปแบบสตริง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแยกวิเคราะห์และจัดรูปแบบสตริง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแยกวิเคราะห์และจัดรูปแบบสตริง”
เรียนรู้ SUBSTRING ตำแหน่ง การแยกข้อความ และการเปลี่ยนตัวพิมพ์ในแต่ละภาษาถิ่น คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การแยกวิเคราะห์และจัดรูปแบบสตริง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคำนวณวันที่และช่วงเวลา
- การตัดและจัดกลุ่มวันที่
- การแยกวิเคราะห์และจัดรูปแบบสตริง
- เขตเวลาและประทับเวลา