Trong phần này chúng ta sẽ tìm hiểu cách gộp (group) các thành phần (kí tự, chuỗi, v.v.) để thực hiện các thao tác như:

  • Thực hiện thay đổi luân phiên (alternation) giữa hai hay nhiều mẫu tuỳ chọn (optional patterns)
  • Tạo các mẫu phụ (subpattern)
  • Tạo một nhóm để tham chiếu trở lại với backreferences
  • Ứng dụng một thao tác đến một mẫu đã được gộp
  • Dùng các nhóm không chiếm giữ (non capturing groups)
  • Nhóm nguyên tử (atomic group)

Ngoài ra, bên cạnh RegExr, chúng ta cũng làm quen với công cụ soạn thảo regular expression của ngôn ngữ Ruby tại trang rubular.com.

Alternation

Chúng ta có thể thay đổi luân phiên (hay xen kẽ) giữa các patterns, ví dụ trong văn bản của chúng ta có nhiều hình thức của từ your như your, Your, hay YOUR. Thực hiện so khớp với nhiều kiểu patterns chúng ta có thể dùng kí hiệu |, ví dụ trong ô Expression của RegExr chúng ta gõ your|Your|YOUR thì kết quả là:

Một giải pháp khác là chọn tuỳ chọn ignore case (i) trong flags cũng cho kết quả tương tự:

Một vài các tuỳ chọn cho thay đổi luân phiên (alternation) có thể được mô tả như bảng sau:

Ví dụ trong ngôn ngữ Perl, Java, hay PCRE chúng ta có thể dùng (?i)your sẽ cho kết quả so khớp tương tự với việc dùng dấu | hay chọn tuỳ chọn ignore case (i). Ví dụ trong Regex Pal (regexpal.com) chọn PCRE:

RegExr chỉ hỗ trợ 3 tuỳ chọn trong flagsglobal (g), ignore case (i), và multiline (m). Tuy nhiên, trong một số ngôn ngữ lập trình như Perl, có nhiều tuỳ chọn hơn như bảng dưới đây:

 Mẫu phụ (subpattern)

Khi chúng ta tham chiếu đến một subpattern nghĩa là chúng ta tham chiếu đến một nhóm (group) hay nhóm trong nhóm (group within group). Subpattern có thể được thiết kế theo nhiều cách.Ví dụ chúng ta có pattern:


(your|Your|YOUR)

có 3 subpattern: subpattern thứ nhất là your, subpattern thứ hai là Your, và subpattern thứ ba là YOUR. Các subpatterns theo sau không phụ thuộc vào subpattern ở trước.

Nếu chúng ta có pattern:


(Y|y)o(u|ur)

Thì các subpattern thứ hai là (u|ur) phụ thuộc vào subpattern thứ nhất (Y|y). Pattern trên sẽ so khớp với :

  • you
  • You
  • your
  • Your

Subpattern có thể được định nghĩa không cần dấu ngoặc đơn như ví dụ dưới đây:


\b[yY][oO][uUrR]*\b

Chúng ta định nghĩa 3 subpattern là: [yY] (so khớp với y hay Y), [oO] (so khớp với o hay O), và [uUrR] (so khớp với u, U, r, hay R); subpattern sau phụ thuộc vào subpattern trước.

Nhóm và tham chiếu trở lại

Khi một pattern nhóm toàn bộ hay một phần nội dung của nó trong cặp ngoặc đơn thì những nội dung này được chiếm giữ và lưu trong bộ nhớ tạm. Chúng ta có thể sử dụng lại nội dung này bằng cách tham chiếu ngược với backreference. Các backreference được dùng như sau:

\1 hay $1: tham chiếu đến nhóm 1; \2 hay $2 tham chiếu đến nhóm 2; v.v.

Ví dụ 1: dùng backreference với mẫu (\w)a\1

Dùng \1 để tham chiếu lại đúng kí tự đứng trước a, các mẫu so khớp có thể là tat, gag, v.v.

Ví dụ 2: chúng ta cũng có tham khảo lại ví dụ phần thêm thẻ HTML trong phần trước.

Ví dụ 3: chúng ta gõ pattern (\w)c(\w) trong ô Expression và trong ô Replace chúng ta gõ <b>$2</b>, kết quả:

Nhóm theo tên (named groups)

Chúng ta có thể tạo nhóm theo tên và tham chiếu đến nhóm thông qua tên. Danh sách sau mô tả cú pháp nhóm theo tên trong các ngôn ngữ:

Ví dụ tạo một nhóm và đặt tên là z, chúng ta sẽ dùng pattern (?<z>0{3}). Thực thi trong ngôn ngữ Ruby bằng cách truy cập rubular.com :

Các nhóm có tên z như sau:

Nếu muốn so khớp vớp 000000 (6 số 0) thì chúng ta có thể dùng mẫu (?<z>0{3})\k<z>

Các nhóm lúc này:

Nhóm không chiếm giữ (non capturing groups)

Khi tạo một nhóm, có thể không cần lưu nội dung của nó trong bộ nhớ tạm vì vậy mà không thể tham chiếu lại bằng cách dùng ?:. Ví dụ pattern (you) sẽ lưu nội dung vào bộ nhớ nhưng pattern (?:you) cũng cho ra cùng kết quả so khớp nhưng nội dung không được lưu vào bộ nhớ.

Nhóm nguyên tử (atomic group)

Trong một số ngôn ngữ có hỗ trợ một hình thức khác của nhóm không chiếm giữ là nhóm nguyên tử (atomic group) dùng ?>. Nhóm này dùng để tắt chế độ quay lui (backtracking) của regex engine. Hình thức như ví dụ sau: (?>you)