Bài 06: None Capturing Group trong Regular Expression

Để hiểu được bài này mình xin nhắc lại một nội dung trong Regular expression trong các bài trước. 1. Nhóm (Group) Một biểu thức chính quy bạn có thể tách ra thành các nhóm (group): // Một biểu thức chính quy $regex = "\s+=\d+"; // Viết dưới dạng group, bởi dấu () $regex2 = ...

Để hiểu được bài này mình xin nhắc lại một nội dung trong Regular expression trong các bài trước.

1. Nhóm (Group)

Một biểu thức chính quy bạn có thể tách ra thành các nhóm (group):

// Một biểu thức chính quy
$regex = "\s+=\d+";
 
// Viết dưới dạng group, bởi dấu ()
$regex2 = "(\s+)(=)(\d+)";
 
// Một cách khác.
$regex3 = "(\s+)(=\d+)";

Các group có thể lồng nhau, và như vậy cần một quy tắc đánh chỉ số các group.  Toàn bộ pattern được định nghĩa là group số 0. Còn lại được mô tả giống hình minh họa dưới đây:

Sử dụng (?:pattern) để thông báo với PHP không xem đây là một group (None-capturing group)

2. None Capturing Group là gì?

Hiểu một cách đơn giản là: None Capturing Group là kỹ thuật không cho một đoạn Regex nào đó được phép xuất hiện trong kết quả trả về.

Ta biết Capturing Value sẽ xác định giá trị trả về cho từng biểu thức Regex con,  Nếu bạn muốn kết quả của biểu thức con đó không xuất hiện trong kết quả trả về? Để giải quyết vấn đề này ta dùng None Capturing Group trong Regular Expression.

Cú pháp: ?:pattern trong đó dấu ?: chính là cú pháp khai báo None Capturing Group trong Regular expression.

Chúng ta sẽ so sánh kết quả của 2 biểu thức chính quy sau bằng việc có và không sử dụng  None Capturing Group.

Ví dụ: Lấy tất cả chuỗi trong dấu ngoặc kép không sử dụng Non Capturing value.

<?php 
	$pattern = '/"(.+?)"/';
	$subject = 'Chào mừng bạn tới học lập trình "PHP Online"';
	preg_match($pattern, $subject, $matches);
	print_r('<pre>');
	print_r($matches); die();
	print_r('</pre>');
?>

  Run

Kết quả:

Array
(
    [0] => "PHP Online"
    [1] => PHP Online
)

Ví dụ: Lấy tất cả chuỗi trong dấu ngoặc kép có sử dụng Non Capturing value.

<?php 
	$pattern = '/"(?:.+?)"/';
	$subject = 'Chào mừng bạn tới học lập trình "PHP Online"';
	preg_match($pattern, $subject, $matches);
	print_r('<pre>');
	print_r($matches); die();
	print_r('</pre>');
?>

  Run

Kết quả:

Array
(
    [0] => "PHP Online"
)

Kết luận: None Capturing Group là kỹ thuật không cho một đoạn Regex nào đó được phép xuất hiện trong kết quả trả về.

3. Tổng kết

Theo mình thì None Capturing Group được gọi là thêm mắm, thêm muối vào Regular Expression để nó thêm phần sinh động. Thực tế rằng nó cũng ít khi được sử dụng. Nhưng nếu nhìn theo một mặt khác thì nó giúp bạn tập chung vào các kết quả trả về tốt hơn thay vì các kết quả không cần thiết.

0