Trong REGEX có một thứ rất hay ho đó là Group (nhóm) các chuỗi nằm trong khoảng từ X đến Y.
Ví dụ chúng ta có một chuỗi:
XXXaaaYYY
Nếu bạn muốn thay thế những gì nằm trong khoảng giữa XXX và YYY, thì bạn có thể viết REGEX cho Tìm và thay thế như sau:
- Tìm kiếm: XXX(.+?)YYY
- Thay thế: XXX$1bbbYYY
Lúc này kết quả cuối cùng sau khi áp dụng Tìm và thay thế sẽ là:
XXXaaabbbYYY
Lệnh (.+?) chính là lệnh nhóm chuỗi nằm trong khoảng từ X đến Y.
Và chúng ta sử dụng ký hiệu đô la $N để biểu đạt cho nhóm đó trong phần Thay thế.
N ở đây là số thứ tự của nhóm trong REGEX.
Dễ hiểu hơn, chúng ta có 1 chuỗi sau:
XXXaaa@eeeYYY
Bây giờ tôi muốn đổi vị trí aaa và eee cho nhau thì sẽ viết REGEX như này:
- Tìm kiếm: XXX(.+?)@(.+?)YYY
- Thay thế: XXX$2@$1YYY
Lúc này kết quả cuối cùng sau khi áp dụng Tìm và thay thế sẽ là:
XXXeee@aaaYYY
Như trên tôi đã tạo ra 2 nhóm và sử dụng $1, $2 để biểu đạt 2 nhóm này trong phần Thay thế:
* Vì vậy: Khi bạn tạo nhiều nhóm trong biểu thức REGEX thì các biến $1, $2,… $N sẽ biểu đạt cho từng nhóm theo thứ tự tương ứng.
Thử nghiệm với Thao tác HTML
Thử nghiệm với REGEXR.COM
Việc sử dụng lệnh (.+?) để nhóm chuỗi chỉ áp dụng được khi chuỗi đó không bị xuống dòng.
Nếu chuỗi đó bị xuống dòng thì biểu thức REGEX sẽ không khớp:
Trong trường hợp như vậy bạn thay lệnh (.+?) bằng lệnh ([\S\s]*)
Ví dụ, chúng ta có chuỗi bị xuống dòng như sau:
XXX
aaa
YYY
Tôi sẽ viết biểu thức REGEX như sau:
XXX([\S\s]*)YYY
Thì REGEX này sẽ khớp (các bạn nhìn thấy 1 match) như sau:
Mọi thứ có vẻ ổn, tuy nhiên nếu có 2 chuỗi giống nhau thì REGEX này khớp nhưng vẫn chỉ 1 match
Có nghĩa rằng lệnh ([\S\s]*) sẽ nhóm chuỗi từ XXX đầu tiên cho đến YYY cuối cùng.
Để giải quyết vấn đề này thì bạn thay lệnh ([\S\s]*) bằng lệnh ([\S\s]*?). Khác nhau ở mỗi dấu ?
Như bạn thấy bây giờ chúng ta đã có 2 match và 2 nhóm đã được tách biệt nhau hoàn toàn.
Ví dụ tiếp, tôi có chuỗi HTML sau:
<ul>
<li></li>
<li></li>
<li></li>
</ul>
Làm thế nào để thay thế <ul> thành <ol> ?
Rất đơn giản, chỉ cần REGEX sau:
- Tìm kiếm: <ul>([\S\s]*?)<\/ul>
- Thay thế: <ol>$1</ol>
Kết quả cuối cùng sau khi áp dụng Tìm và thay thế sẽ là:
<ol>
<li></li>
<li></li>
<li></li>
</ol>
Chúc các bạn hiểu và thành công. 👿 😀