Chúng ta đã được học qua khái niệm Capturing Value trong bài các quy tắc Regular Expression căn bản thì trong bài này ta sẽ đến một khái niệm khác đó là None Capturing Group, đây là một khái niệm ngược lại với Capturing Value trong Regular Expression.
Như ta biết Capturing Value sẽ xác định giá trị trả về cho từng biểu thức RegEx con, nhưng đôi lúc ta lại muốn biểu thức con đó không xuất hiện trong kết quả trả về thì làm thế nào? Để giải quyết vấn đề này ta dùng None Capturing Group trong Regular Expression.
Cú pháp: /regex
:?
regex/ trong đó dấu :?
chính là cú pháp khai báo None Capturing Group.
Để dễ hiểu hơn ta tìm hiểu một số ví dụ nhé (Code PHP):
None Capturing Group Regular Expression
Ví dụ 1: Lấy tất cả chuỗi trong dấu ngoặc kép sau (lấy luôn dấu ngoặc kép)
program "Hello World"
1
2
3
4
5
6
7
| preg_match( '/"(?:.+)"/' , 'program "Hello World"' , $matches ); echo '<pre>' ; print_r( $matches ); echo '</pre>' ; |
Array ( [0] => "Hello World" )
Nếu như bạn đã đọc qua phần Capturing Value và bài hàm preg_match trong php thì bạn sẽ thấy bất thường. Lẽ ra phải trả về 2 kết quả vì ta có:
- Partern toàn bộ:
/"(?:.+)"/
- Partern con:
(?:.+)
Nhưng vì ta đã dùng None Capturing Group ở biểu thức RegEx con
(?:.+)
nên biểu thức con này không được liệt kê kết quả trả về.
Nếu ta không dùng None Capturing Group thì code sẽ như sau:
1
2
3
4
5
6
7
| preg_match( '/"(.+)"/' , 'program "Hello World"' , $matches ); echo '<pre>' ; print_r( $matches ); echo '</pre>' ; |
1
2
3
4
5
| Array ( [0] => "Hello World" [1] => Hello World ) |
Từ ví dụ trên ta có kết luận:
None Capturing Group là kỹ thuật không cho một đoạn Regex nào đó xuất hiện trong kết quả trả về
Một số ví dụ none capturing group khác
Ví dụ 2: Cho chuỗi
$subject = 'program (None capturing group "Welcome To You")'
, Hãy lấy nội dung chữNone capturing group
trong chuỗi trên, kết quả trả về bỏ đi đoạn Welcome To You
1
2
3
4
5
6
7
| preg_match( '/\((.+)"(?:.+)"\)/' , 'program (None capturing group "Welcome To You")' , $matches ); echo '<pre>' ; print_r( $matches ); echo '</pre>' ; |
Array ( [0] => (None capturing group "Welcome To You") [1] => None capturing group )
Nếu bạn bỏ đi biểu thức None Capturing Group thì kết quả sẽ như sau:
1
2
3
4
5
6
7
| preg_match( '/\((.+)"(.+)"\)/' , 'program (None capturing group "Welcome To You")' , $matches ); echo '<pre>' ; print_r( $matches ); echo '</pre>' ; |
Array ( [0] => (None capturing group "Welcome To You") [1] => None capturing group [2] => Welcome To You )
Lời Kết
Phần None Capturing Group này thực ra cũng ít sử dụng, nhưng bạn cũng nên biết nó để xử lý nhuần nhuyễn RegEx hơn nhé. Bài tiếp theo mình nghiên cứu Lookbehind trong Regular Expression
Nguồn: (code.freetuts.net)
0 nhận xét: