bởi Catherine Vassant (hay còn gọi là Codingk8)
Sử dụng hàm tạo Regexp ?️
Bài viết này dựa trên Kịch bản thuật toán cơ bản của freeCodeCamp “Xác nhận kết thúc”.
Thử thách này liên quan đến việc kiểm tra xem Chuỗi có kết thúc bằng một chuỗi ký tự cụ thể hay không.
Trong bài viết này, tôi sẽ giải thích cách giải quyết vấn đề này thử thách sử dụng RegExp.
Khía cạnh thú vị của giải pháp này là sử dụng hàm tạo RegExp để tạo RegExp cụ thể mà bạn cần để kiểm tra các Chuỗi được truyền dưới dạng đối số.
Thử thách thuật toán
Kiểm tra xem một chuỗi (đối số đầu tiên,
str
) kết thúc bằng chuỗi đích đã cho (đối số thứ hai,target
).
Thách thức này có thể được giải quyết bằng
.endsWith()
phương pháp, được giới thiệu trong ES2015. Nhưng với mục đích của thử thách này, chúng tôi muốn bạn sử dụng một trong các phương thức chuỗi con JavaScript để thay thế.
Các trường hợp thử nghiệm được cung cấp
confirmEnding("Bastian", "n")
nên trả về đúng.
confirmEnding("Congratulation", "on")
nên trả về đúng.
confirmEnding("Connor", "n")
nên trả về sai.
confirmEnding("Walking on water and developing software from a specification are easy if both are frozen", "specification")
nên trả về sai.
confirmEnding("He has to give me a new name", "name")
nên trả về đúng.
confirmEnding("Open sesame", "same")
nên trả về đúng.
confirmEnding("Open sesame", "pen")
nên trả về sai.
confirmEnding("Open sesame", "game")
nên trả về sai.
confirmEnding("If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing", "mountain")
nên trả về sai.
confirmEnding("Abstraction", "action")
nên trả về đúng.
Không sử dụng phương pháp tích hợp
.endsWith()
để giải quyết thách thức.
1. Ý tưởng đầu tiên hoàn toàn không hiệu quả
Nếu, giống như tôi, bạn là người yêu thích RexExp, nỗ lực đầu tiên của bạn có thể là thử giải quyết thử thách với mã bên dướivà nó sẽ không hoạt động.
Lý do là, với cú pháp này, hàm test() sẽ tìm Chuỗi “đích” cụ thể chứ không phải “đích” dưới dạng một biến được truyền dưới dạng đối số.
Nếu chúng ta quay lại các trường hợp thử nghiệm của mình, những trường hợp trả về “false” sẽ vượt qua, nhưng không có trường hợp nào trả về “true” vượt qua, điều này khá dễ đoán.
2. Giải quyết thách thức bằng cách tạo RegExp cụ thể mà bạn cần với hàm tạo RegExp
Để sử dụng một RegExp sẽ “hiểu” rằng đối số “mục tiêu” là một biến chứ không phải “mục tiêu” Chuỗi, bạn phải tạo một RegExp do taylor tạo bằng cách sử dụng hàm tạo RegExp.
Và, trước khi tiếp tục, chúng ta hãy quay lại một phút và xem xét những gì chúng ta muốn kiểm tra: đối số “mục tiêu” phải là phần cuối của đối số “str”. Điều này có nghĩa là RegExp của chúng tôi phải kết thúc bằng ký tự “$”.
Bây giờ, chúng ta có thể giải quyết thách thức này trong ba bước
Bước 1 – Tạo một biến thêm “$” vào cuối đối số “đích”, sử dụng phương thức concat() trong trường hợp này.
Bước 2 – Sử dụng hàm tạo RegExp và toán tử “new” để tạo đúng RexExp với biến trên.
Bước 3 – Trả về kết quả của hàm test().
Và điều này vượt qua tất cả các bài kiểm tra trường hợp một cách đẹp đẽ?
Điều này có thể được cấu trúc lại trong hai dòng như thế này
Ghi chú: vì không có trường hợp thử nghiệm nào ngụ ý kiểm tra cách viết hoa của các chữ cái nên không cần sử dụng cờ “i”.
Liên kết hữu ích
String.prototype.concat() trong MDN
RegExp.prototype.test() trong MDN
Hàm tạo RegExp trong MDN
Cụm từ thông dụng trong freeCodeCamp
Các giải pháp khác cho thách thức này
Các thử thách “Nhận gợi ý” gợi ý một giải pháp bằng cách sử dụng phương thức slice().
Bạn có thể tìm thấy hai cách khác để giải quyết thách thức này, một với phương thức chất nền() và cái khác với phương thức kết thúcWith(), được giải thích bởi Sonya Moisset trong bài viết này.
Giải pháp RegExp đặc biệt này có thể cũng giúp bạn giải quyết thử thách Viết mã thuật toán trung gian freeCodeCamp “Tìm kiếm và thay thế”.
Cảm ơn bạn đã đọc! ✨
Nếu bạn thích bài viết này, hãy “vỗ tay” bao nhiêu lần tùy thích và chia sẻ nó để giúp người khác tìm thấy nó. Điều đó có thể làm cho ngày của họ.
Nếu bạn có một phản ứng/câu hỏi/gợi ýhãy chắc chắn để lại một bình luận dưới đây. Tôi sẽ được vui mừng để đọc từ bạn!
Bạn cũng có thể liên lạc và/hoặc theo dõi tôi trên Twitter.