ช่วยหน่อยครับ ข้อ Restrict Possible Usernames

ขอคำแนะนำด้วยครับ
ถ้าช่วยอธิบายว่าที่เขียนอยู่ผิดยังไงด้วยก็ดีครับ


let username = "JackOfAllTrades";
let userCheck = /^[a-z][a-z]+\d*$/i; // Change this line
let result = userCheck.test(username);

Challenge: Restrict Possible Usernames

ไปสู่ the challenge:

จริงๆ โค้ดของคุณก็ใกล้ถูกแล้วนะครับ หากนำโค้ดไปรันดูจะสังเกตุว่าเหลือแค่เคสเดียวที่ยังไม่ผ่านคือ ต้อง 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

ก็ประมาณนั้นแหละครับ ผมเองก็อธิบายไม่ค่อยเก่งด้วย

1 Likes

อธิบายดีมากครับ ผมก็ งง ข้อนี้เหมือนกัน