จริงๆ โค้ดของคุณก็ใกล้ถูกแล้วนะครับ หากนำโค้ดไปรันดูจะสังเกตุว่าเหลือแค่เคสเดียวที่ยังไม่ผ่านคือ ต้อง match กับ Z97 ด้วยใช่ไหมครับ ทีนี้เราลองมาดูกันดีกว่าว่าทำไม regex ด้านล่างจึงไม่ครอบคลุมเคสดังกล่าว
/^[a-z][a-z]+\d*$/i
เราลองแปลเป็นภาษาที่คนเเข้าใจจะเป็นดังนี้ครับ
-
^[a-z]
เริ่มต้นด้วยตัวอักษร a-z
-
[a-z]+
ถัดมาต้องเป็นตัวอักษร a-z หนึ่งตัวขึ้นไป
-
\d*$
ลงท้ายด้วย ตัวเลข ตั้งแต่ 0 ตัวขึ้นไป
(ในที่นี่ขออนุญาติข้าม flags ไปนะครับ)
จะเห็นจากคำอธิบายข้างต้น Z97 จะไม่เข้าเงื่อนไข เนี่องจากตัวที่ถัดจากตัวเเรกต้องเป็นตัวอักษรเท่านั้น ดังนั้นในกรณีนี้ผมอาจจะอยากปรับเปลี่ยนเล็กน้อยให้เป็นดังนี้
/^[a-z]([a-z]+\d*$|\d{2,}$)/i
จะเห็นว่ามีการเพิ่ม เงื่อนไข |
(หรือ) และตามด้วย \d{2,}$
(ลงท้ายด้วยตัวเลขตั้งแต่ 2 ตัวขึ้นไป)
เราลองแปลเป็นภาษาที่คนเเข้าใจจะเป็นดังนี้ครับ
-
^[a-z]
เริ่มต้นด้วยตัวอักษร a-z
-
([a-z]+\d*$|\d{2,}$)
กลุ่มของตัวอักษรซึ่งมีรายละเอียดดังนี้
–[a-z]+\d*$
ถัดมาต้องเป็นตัวอักษร a-z หนึ่งตัวขึ้นไป ลงท้ายด้วย ตัวเลข ตั้งแต่ 0 ตัวขึ้นไป
– |
หรือ
– \d{2,}$
ถัดมาต้องเป็นตัวเลขสองตัวที่ลงท้าย
หรือเราสามารถทำให้มันอ่านง่ายขึ้นมาหน่อยก็คงน่าจะได้ประมาณนี้ครับ
/^[a-z]([a-z]+\d*|\d{2,})$/i
ก็ประมาณนั้นแหละครับ ผมเองก็อธิบายไม่ค่อยเก่งด้วย