Chúng tôi có thể giúp gì?
Categories
< Tất cả chủ đề

Cơ bản về Group trong REGEX

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  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  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. 👿 😀

Liên hệ