Nhìn trước trong biểu thức chính quy Regular
Chào các bạn
Trong bài viết này mình sẻ viết bài về nhìn trước x(?=y). Trong đó x hoặc y là ký tự hoặc chuỗi hoặc cái gì đó tùy bạn.
Nhìn trước
Nhìn trước x(?=y) là một kỹ thuật rất quan trọng. Nếu các bạn học Regexp thì cũng bắt buộc bạn phải biết. Nó có rất rất là nhiều cái lợi. Chúng ta cùng nhau đi tìm hiểu nó nhé.
Cú pháp
1let str = "Hồ Quang Trí"; 2 3let reg = /.+(?=\s)/
Ví dụ:
- Trận đấu /.+(?=\s)/
1let str = "Hồ Quang Trí"; 2 3let reg = /.+(?=\s)/ 4 5let ketQua = reg.exec(str); 6 7console.log(ketQua); // ['Hồ Quang', index: 0, input: 'Hồ Quang Trí', groups: undefined]
Ý nghĩa trận đấu /.+(?=\s)/ là. Bắt đầu bằng bất kỳ ký tự nào ngoại trừ một dòng mới \n đó là ký tự đặc biệt chấm . tiếp theo là định lượng tham lam cộng + sẽ chạy đến hết chuỗi, đến khi nào gặp \n thì thôi. Bây giờ thì nó sẽ đi lùi lại đến khi nào gặp \s thì trả về kết quả hoặc null.
Có vẻ khó hiểu đúng không các bạn. Bây giờ mình sẽ nói cách nó chạy cho các bạn bằng code.
1// Hồ Quang Trí 2// /.+(?=\s)/ 3// .+ => H 4// H.+ => ồ 5// Hồ.+ => \s 6// Hồ\s.+ => Q 7// Hồ Q.+ => u 8// Hồ Qu.+ => a 9// Hồ Qua.+ => n 10// Hồ Quan.+ => g 11// Hồ Quang.+ => \s 12// Hồ Quang\s.+ => T 13// Hồ Quang T.+ => r 14// Hồ Quang Tr.+ => í 15// Hồ Quang Trí.+ => \n 16// Đến đây thì hết chuỗi. Nhưng trận đấu chúng ta vẫn còn. Định lượng tham lam + nó đi lùi lại. 17// Hồ Quang Trí 18// ............+(?=\s) => Hồ Quang Tr 19// ...........+(?=\s) => Hồ Quang T 20// ..........+(?=\s) => Hồ Quang\s 21// .........+(?=\s) => Hồ Quang 22// Hồ Quang
Nhìn có vẽ phức tạp đúng không các bạn. Nhưng không sao. Đó là cách mình hình dung thôi. Còn thuật toán thì sao mà mình biết được.
Nhưng mà cũng đúng đó. Nếu không đúng thì tại sao không phải Hồ mà lại Hồ Quang. Cho nên bắt buộc chúng ta phải hiểu từng ý nghĩa của từng định lượng.
Áp dụng
Ý nghĩa của nhìn trước /x(?=y)/ chỉ có vậy. Nên bây giờ mình ví dụ cái này cho các bạn hiểu rõ hơn.
Ví dụ: Chúng ta có một chuỗi str. Trong chuỗi str đó bao gồm cả chữ và số. Trong số đó có vài số kết thúc bằng đ. Nhiệm vụ của chúng ta là lấy ra tất cả các số kết thúc bằng đ đó.
1let str = "Tôi có 10 và 100đ còn bạn thì sao? 1 hay 30đ"; 2 3let reg = /[0-9]+(?=đ)/g; 4 5let ketQua = str.match(reg); 6 7console.log(ketQua); // ['100', '30']
Vậy là xong cũng không có gì khó đúng không các bạn. Mình cũng nên giải thích trận đấu /[0-9]+(?=đ)/g cho các bạn hiểu rõ tí.
Đơn nhiên là các bạn có thể dùng nhiều phương pháp khác để áp dụng.
1let str = "Tôi có 10 và 100đ còn bạn thì sao? 1 hay 30đ"; 2 3let reg = /[0-9]+(?=đ)/g; 4 5let ketQua = str.matchAll(reg); 6 7console.log([...ketQua]); 8 9// [ 10// ['100', index: 13, input: 'Tôi có 10 và 100đ còn bạn thì sao? 1 hay 30đ', groups: undefined] 11// ['30', index: 41, input: 'Tôi có 10 và 100đ còn bạn thì sao? 1 hay 30đ', groups: undefined] 12// ]
Và còn nhiều phương pháp khác nữa. tùy thuộc vào bạn. Với mình thì chừng đó là đủ rồi.
Tổng kết
Trong bài viết này mình đã nói cho các bạn về nhìn trước x(?=y). Các bạn cũng nên nhớ nó vào tâm trí nhé.
Đối tượng Regexp có rất rất là nhiều thứ phải nhớ. Và cái ấy chắc phải cần nhiều thời gian. Trừ khi nào bạn là thiên tài.
Ok hẹn gặp bạn ở bài sau.
- regular
- string
- object
- number
Các bài viết liên quan
Phạm vi ngoặc vuông trong biểu thức chính quy Regexp
Phạm vi [] trong regexp rất quan trọng. Nó có rất rất là nhiều ý nghĩa.RegularNhóm nội dung trong biểu thức chính quy Regexp
Nhóm () cũng là một ký tự đặc biệt trong Regular. Nó có rất nhiều thứ mà các bạn cần phải biết.RegularLoại trừ bộ nhớ khỏi nhóm trong biểu thức chính quy Regular
Để loại trừ bộ nhớ khỏi nhóm thì chúng ta dùng (?:). Đi kèm với đó thì mất đi cơ hội.Regular