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.

Bài liên quan

Bài 19: Sử dụng Regular expression trong MYSQL

Trong loạt các bài viết trước mình đã viết về Regular Expression . Trong bài viết này mình sẽ nói về Regular expression được sử dụng thế nào trong truy vấn dữ liệu. Mình sẽ nhắc lại một số ký hiệu Meta được sử dụng trong MySQL. Những ký tự này mình đã trình bày tại các quy tắc cơ bản của ...

Vũ Văn Thanh viết 3 tuần trước

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 = ...

Hoàng Hải Đăng viết 3 tuần trước

Bài 06: Tính kế thừa trong OPP PHP

1. Kế thừa là gì ? Là một đối Object con sẽ nhận mọi thuộc tính và phương thức của Object cha làm thuộc tính và phương thức của nó nếu các thuộc tính & phương thức của Object cha có mức truy cập là public và protected. Cú pháp: class classChild extends classParent { // Sone } ...

Tạ Quốc Bảo viết 3 tuần trước

Tìm Hiểu Về Character Class trong Regular Expression

[] - Character Class [] trong regular express được dùng để áp dụng so sánh với lần lượt từng ký tự một trong văn bản mà thoả mãn điều kiện cho trước. Một Số Pattern Sử Dụng Character Class Pattern [abc] sẽ chọn ra các ký tự có giá trị là a, b hoặc c. Pattern [a-z] sẽ chọn ra các ký tự ...

Tạ Quốc Bảo viết 13:40 ngày 07/09/2018

RegExp - Regular Expression trong Javascript

Bài này chúng ta sẽ tìm hiểu đến chuỗi và cách sử dụng biểu thức chính quy ( Regular Expression ) để xử lý chuỗi nâng cao. Như ta biết Regular ...

Trịnh Tiến Mạnh viết 10:01 ngày 03/08/2018
0