นิพจน์ทั่วไปของ MYSQL (REGEXP) พร้อมไวยากรณ์และตัวอย่าง
นิพจน์ทั่วไปคืออะไร?
นิพจน์ทั่วไปช่วยค้นหาข้อมูลที่ตรงกับเกณฑ์ที่ซับซ้อน เราได้ดูไวลด์การ์ดในบทช่วยสอนก่อนหน้านี้แล้ว หากคุณเคยทำงานกับไวลด์การ์ดมาก่อน คุณอาจสงสัยว่าทำไมจึงต้องเรียนรู้นิพจน์ทั่วไปในเมื่อคุณสามารถได้ผลลัพธ์ที่คล้ายกันโดยใช้ไวลด์การ์ด เนื่องจากเมื่อเปรียบเทียบกับไวลด์การ์ด นิพจน์ทั่วไปช่วยให้เราค้นหาข้อมูลที่ตรงกับเกณฑ์ที่ซับซ้อนยิ่งขึ้นได้
ไวยากรณ์พื้นฐาน
ไวยากรณ์พื้นฐานสำหรับนิพจน์ทั่วไปมีดังนี้
SELECT statements... WHERE fieldname REGEXP 'pattern';
ที่นี่ -
- “คำสั่ง SELECT…” เป็นมาตรฐาน คำสั่ง SELECT
- “ชื่อฟิลด์อยู่ที่ไหน” คือชื่อของคอลัมน์ที่จะใช้กับนิพจน์ทั่วไป
- “REGEXP 'รูปแบบ'” REGEXP คือตัวดำเนินการของนิพจน์ทั่วไป และ 'รูปแบบ' แสดงถึงรูปแบบที่ต้องจับคู่โดย REGEXP RLIKE คือ คำพ้องความหมายสำหรับ REGEXP และให้ผลลัพธ์เดียวกันกับ REGEXP เพื่อหลีกเลี่ยงความสับสนกับตัวดำเนินการ LIKE ควรใช้ REGEXP ดีกว่า แทน.
ตอนนี้เรามาดูตัวอย่างการปฏิบัติ -
SELECT * FROM `movies` WHERE `title` REGEXP 'code';
ข้อความค้นหาข้างต้นจะค้นหาชื่อภาพยนตร์ทั้งหมดที่มีรหัสคำอยู่ ไม่สำคัญว่า "รหัส" จะอยู่ต้น กลาง หรือท้ายชื่อเรื่อง ตราบใดที่มีอยู่ในชื่อเรื่องก็จะได้รับการพิจารณา
สมมติว่าเราต้องการค้นหาภาพยนตร์ที่ขึ้นต้นด้วย a, b, c หรือ d ตามด้วยอักขระอื่นๆ จำนวนเท่าใดก็ได้ เราจะดำเนินการอย่างไรจึงจะบรรลุเป้าหมายนั้น เราสามารถใช้นิพจน์ทั่วไปร่วมกับอักขระเมตาเพื่อให้ได้ผลลัพธ์ที่ต้องการ
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
ดำเนินการสคริปต์ข้างต้นใน MySQL ปรับแต่ง จาก myflixdb เราจะได้ผลลัพธ์ดังนี้
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
4 | Code Name Black | Edgar Jimz | 2010 | NULL |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
6 | Angels and Demons | NULL | 2007 | 6 |
7 | Davinci Code | NULL | 2007 | 6 |
ตอนนี้เรามาดูนิพจน์ทั่วไปของเราซึ่งรับผิดชอบต่อผลลัพธ์ข้างต้นกันดีกว่า
'^[abcd]' เครื่องหมายรูปหมวก (^) หมายความว่าควรใช้การจับคู่รูปแบบที่จุดเริ่มต้น และรายการอักขระ [abcd] หมายความว่าเฉพาะชื่อภาพยนตร์ที่ขึ้นต้นด้วย a, b, c หรือ d เท่านั้นที่จะถูกส่งกลับในชุดผลลัพธ์ของเรา
มาแก้ไขสคริปต์ด้านบนของเราและใช้รายการ NOT charlist แล้วดูว่าเราจะได้รับผลลัพธ์อะไรหลังจากดำเนินการค้นหาของเรา
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
ดำเนินการสคริปต์ข้างต้นใน MySQL การใช้งาน workbench กับ myflixdb จะให้ผลลัพธ์ดังต่อไปนี้
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
1 | Pirates of the Caribean 4 | Rob Marshall | 2011 | 1 |
2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
3 | X-Men | 2008 | ||
9 | Honey mooners | John Schultz | 2005 | 8 |
16 | 67% Guilty | 2012 | ||
17 | The Great Dictator | Chalie Chaplie | 1920 | 7 |
18 | sample movie | Anonymous | 8 | |
19 | movie 3 | John Brown | 1920 | 8 |
ตอนนี้เรามาดูนิพจน์ทั่วไปของเราซึ่งรับผิดชอบต่อผลลัพธ์ข้างต้นกันดีกว่า
'^[^abcd]' เครื่องหมายรูปหมวก (^) หมายความว่าควรใช้การจับคู่รูปแบบที่จุดเริ่มต้น และรายการอักขระ [^abcd] หมายความว่าชื่อภาพยนตร์ที่ขึ้นต้นด้วยอักขระที่ล้อมรอบจะไม่รวมอยู่ในชุดผลลัพธ์
เมตาอักขระนิพจน์ทั่วไป
สิ่งที่เราดูในตัวอย่างข้างต้นคือรูปแบบที่ง่ายที่สุดของนิพจน์ทั่วไป ตอนนี้เรามาดูการจับคู่รูปแบบนิพจน์ทั่วไปขั้นสูงเพิ่มเติมกัน สมมติว่าเราต้องการค้นหาชื่อภาพยนตร์ที่ขึ้นต้นด้วยรูปแบบ “โค้ด” โดยใช้นิพจน์ทั่วไป เราจะดำเนินการอย่างไร? คำตอบคือ metaตัวละคร ช่วยให้เราปรับแต่งผลการค้นหารูปแบบของเราได้อย่างละเอียดโดยใช้นิพจน์ทั่วไป
ถ่าน | Descriptไอออน | ตัวอย่าง | |
---|---|---|---|
* | เทศกาล เครื่องหมายดอกจัน (*) meta character ใช้เพื่อจับคู่อินสแตนซ์ของสตริงก่อนหน้าศูนย์ (0) ขึ้นไป | SELECT * จากภาพยนตร์ โดยที่ชื่อ REGEXP 'da*'; จะให้ภาพยนตร์ทั้งหมดที่มีตัวละคร “ดา” เช่น Da Vinci Code , Daddy's Little Girls | |
+ | เทศกาล บวก (+) meta character ใช้เพื่อจับคู่สตริงก่อนหน้าอย่างน้อยหนึ่งอินสแตนซ์ | SELECT * จาก `ภาพยนตร์` โดยที่ `title` REGEXP 'mon+'; จะให้ภาพยนตร์ทั้งหมดที่มีตัวละคร “mon” เช่น Angels และ Demons | |
? | คำถาม(?) meta character ใช้เพื่อจับคู่ศูนย์ (0) หรือหนึ่งอินสแตนซ์ของสตริงที่อยู่ข้างหน้า | SELECT * จาก `หมวดหมู่` WHERE `category_name` REGEXP 'com?'; จะให้หมวดหมู่ทั้งหมดที่มี string com เช่น ตลก โรแมนติกคอมเมดี้ | |
. | เทศกาล จุด (.) metaCharacter ใช้เพื่อจับคู่อักขระเดี่ยวใดๆ ยกเว้นการขึ้นบรรทัดใหม่ | SELECT * จากภาพยนตร์ที่ `year_released` REGEXP '200.'; จะให้ภาพยนตร์ทั้งหมดที่ออกฉายในปีต่างๆ เริ่มต้นด้วยอักขระ “200” ตามด้วยอักขระตัวเดียว ตัวอย่างเช่น 2005,2007,2008 เป็นต้น | |
[เอบีซี] | เทศกาล ชาร์ลิสต์ [abc] ใช้เพื่อจับคู่อักขระที่แนบมา | SELECT * จาก `ภาพยนตร์` WHERE `title` REGEXP '[vwxyz]'; จะให้ภาพยนตร์ทั้งหมดที่มีตัวละครตัวเดียวใน "vwxyz" ตัวอย่างเช่น X-Men, Da Vinci Code เป็นต้น | |
[^เอบีซี] | เทศกาล ชาร์ลิสต์ [^abc] ใช้เพื่อจับคู่อักขระใดๆ ยกเว้นอักขระที่อยู่ล้อมรอบ | SELECT * จาก `ภาพยนตร์` WHERE `title` REGEXP '^[^vwxyz]'; จะให้ภาพยนตร์ทั้งหมดที่มีตัวละครอื่นนอกเหนือจากใน "vwxyz" | |
[AZ] | เทศกาล [AZ] ใช้เพื่อจับคู่อักษรตัวพิมพ์ใหญ่ใดๆ | SELECT * จาก `สมาชิก` WHERE `postal_address` REGEXP '[AZ]'; จะให้สมาชิกทุกคนที่มีที่อยู่ทางไปรษณีย์ที่มีอักขระตั้งแต่ A ถึง Z เช่น Janet Jones สมาชิกหมายเลข 1 | |
[az] | เทศกาล [az] ใช้เพื่อจับคู่อักษรตัวพิมพ์เล็ก | SELECT * จาก `สมาชิก` WHERE `postal_address` REGEXP '[az]'; จะให้สมาชิกทุกคนที่มีที่อยู่ทางไปรษณีย์ที่มีอักขระตั้งแต่ a ถึง z เช่น Janet Jones สมาชิกหมายเลข 1 | |
[0 9-] | เทศกาล [0 9-] ใช้เพื่อจับคู่ตัวเลขใดๆ ตั้งแต่ 0 ถึง 9 | SELECT * จาก `สมาชิก` โดยที่ `contact_number` REGEXP '[0-9]' จะให้หมายเลขติดต่อแก่สมาชิกทุกคนที่ส่งเข้ามา ซึ่งมีอักขระ “[0-9]” เช่น Robert Phil. | |
^ | เทศกาล คาเร็ต (^) ใช้เพื่อเริ่มการแข่งขันตั้งแต่เริ่มต้น | SELECT * จาก `ภาพยนตร์` WHERE `title` REGEXP '^[cd]'; ให้ภาพยนตร์ทั้งหมดที่มีชื่อเรื่องขึ้นต้นด้วยตัวละครใดๆ ใน “cd” ตัวอย่างเช่น Code Name Black, Daddy's Little Girls และ Da Vinci Code | |
| | เทศกาล แถบแนวตั้ง (|) ใช้เพื่อแยกทางเลือกอื่น | SELECT * จาก `ภาพยนตร์` WHERE `title` REGEXP '^[cd]|^[u]'; ให้ภาพยนตร์ทั้งหมดที่มีชื่อเรื่องขึ้นต้นด้วยอักขระใดๆ ใน "cd" หรือ "u" ตัวอย่างเช่น ชื่อรหัส Black, สาวน้อยของ Daddy, Da Vinci Code และ Underworld – Awakenไอเอ็นจี | |
- | เทศกาล- ตรงกับจุดเริ่มต้นของคำ | SELECT * จาก `ภาพยนตร์` WHERE `title` REGEXP '[[:<:]]for';
ให้ภาพยนตร์ทุกเรื่องที่มีชื่อเรื่องขึ้นต้นด้วยตัวละคร ตัวอย่าง: การลืม Sarah Marshal |
|
- | เทศกาล - ตรงกับส่วนท้ายของคำ | SELECT * จาก `ภาพยนตร์` WHERE `title` REGEXP 'ack[[:>:]]';
ให้หนังทุกเรื่องที่มีชื่อเรื่องลงท้ายด้วยตัวอักษร “แอ๊ค” .เช่น ชื่อรหัส สีดำ. |
|
[:ระดับ:] | เทศกาล [:ระดับ:] ตรงกับคลาสตัวละครเช่น
[:อัลฟ่า:] เพื่อจับคู่ตัวอักษร [:ช่องว่าง:] เพื่อให้เข้ากับพื้นที่สีขาว [:หมัด:] คือการจับคู่เครื่องหมายวรรคตอนและ [:upper:] สำหรับตัวอักษรชั้นบน |
SELECT * จาก `ภาพยนตร์` WHERE `title` REGEXP '[:alpha:]';
ให้ภาพยนตร์ทั้งหมดที่มีชื่อเรื่องประกอบด้วยตัวอักษรเท่านั้น เช่น การลืม Sarah Marshal, X-Men เป็นต้น คำค้นหานี้ละเว้นภาพยนตร์อย่าง Pirates of the Caribbean 4 |
แบ็กสแลช (\) ใช้เป็นอักขระหลบหนี หากเราต้องการใช้แบ็กสแลชเป็นส่วนหนึ่งของรูปแบบในนิพจน์ทั่วไป เราควรใช้แบ็กสแลชคู่ (\\)
สรุป
- นิพจน์ทั่วไปให้การจับคู่รูปแบบที่มีประสิทธิภาพและยืดหยุ่น ซึ่งสามารถช่วยให้เราปรับใช้ยูทิลิตี้การค้นหาพลังงานสำหรับระบบฐานข้อมูลของเรา
- REGEXP คือตัวดำเนินการที่ใช้เมื่อดำเนินการจับคู่รูปแบบนิพจน์ทั่วไป RLIKE คือคำพ้องความหมาย
- นิพจน์ทั่วไปรองรับอักขระเมตาจำนวนหนึ่งซึ่งช่วยให้มีความยืดหยุ่นและควบคุมได้มากขึ้นเมื่อดำเนินการจับคู่รูปแบบ
- แบ็กสแลชใช้เป็นอักขระ escape ในนิพจน์ทั่วไป โดยจะพิจารณาเฉพาะในกรณีที่ใช้แบ็กสแลชสองตัวเท่านั้น
- นิพจน์ทั่วไปไม่คำนึงถึงขนาดตัวพิมพ์