Regex lọc ra phần đầu của path trong JavaScript

Mình muốn viết regex lọc ra những chỗ in đậm của các dòng sau đây:
/
**/**login
**/**profile
**/en/**abc
**/de/**xyz
/vi
/en
/de
Mình mới viết được tới /(\w{2}/)? nhưng chưa biết cách để chọn dòng /vi và /en. Các bác giúp mình với, mình dùng trang http://rubular.com/ để thử.

Sao in đậm không được vậy ta :frowning:

Muốn thế này phải không?

^\/(([a-z]{2})([\-_][a-zA-Z]{2})?)(\/\w*)?$

Kiểm thử:

Nhóm khớp:

Match 1
1.	en
2.	en
3.	 
4.	/abc
Match 2
1.	de
2.	de
3.	 
4.	/xyz
Match 3
1.	vi_VN
2.	vi
3.	_VN
4.	 
Match 4
1.	vi_VN
2.	vi
3.	_VN
4.	/logout
Match 5
1.	vi
2.	vi
3.	 
4.	 
Match 6
1.	en
2.	en
3.	 
4.	 
Match 7
1.	de
2.	de
3.	 
4.	 
Match 8
1.	en-US
2.	en
3.	-US
4.	 
Match 9
1.	vi-VN
2.	vi
3.	-VN
4.	/profile
  • Chỉ có 2 dòng đầu không khớp. Vì không có mã ngôn ngữ.
  • Cách viết mã ngôn ngữ và mã quốc gia cách nhau bằng - hoặc _ nên mình viết cho cả 2 trường hợp
  • Theo kết quả các nhóm thì có thể lấy nhóm:
  1. Mã ngôn ngữ và mã quốc gia.
  2. Chỉ mã ngôn ngữ.
  3. Chỉ mã quốc gia (nếu có).
  4. Đường dẫn nối tiếp.
1 Like

/login và /profile đều match dấu / nữa bạn ơi
Mình cũng không cần lấy nhóm, mình chỉ cần match để xóa đoạn đầu đi thôi

Vậy làm hiểu lầm rồi :confused:

^\/[a-z]{2}([\-_][A-Z]{2})?$|\/([a-z]{2}([\-_][A-Z]{2})?\/)?

Kết quả:

Thay vì kiếm nó xóa để lấy đoạn sau, sao không dùng regex lấy luôn đoạn sau có phải tiện hơn không?

5 Likes

Bác nói đúng. Thay vì dùng replace để xóa thì match thẳng đoạn sau nó nhanh hơn
Cái link web mình nó chỉ bắt đầu bằng 2 kí tự thôi vd như /en/abc hoặc /en chứ ko có phần -VN nhưng cách tổng quát của bác rất hay. Thank bác ^^

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?