Bài 06: None Capturing Group trong Regular Expression

Regular Expression 05/02/2017 03:46 1152
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ề.Nó là một khái niệm ngược lại với Capturing Value 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 = "(\\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.

 

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.