Bài đăng nổi bật

Hướng dẫn thay đổi thư mục root mặc định của Docker trên Linux

Hoàn cảnh: người viết gặp một trường hợp như này Được team hạ tầng cấp cho một máy chủ gồm 2 phân vùng lưu trữ, 1 phân vùng 20GB được gắn và...

28 tháng 5, 2016

Regular Expression trong lập trình

Bất cứ ai khi bước chân vào con đường lập trình chắc cũng đều đã từng làm việc với Regular Expression (hiểu nôm na nó là một chuỗi quy định một quy tắc nào đó). Nhưng chắc sẽ ít người hiểu thấu đáo được tác dụng và cách sử dụng nó như nào.
Trong bài viết này tôi xin phép giới thiệu sơ lược về Regular Expression, tất nhiên chỉ nằm trong vốn hiểu biết của tôi.

Dưới đây là bảng các kí tự, điều hướng trong Regular Expression.

Metacharacters

Ký tựÝ nghĩa
^Bắt đầu của chuỗi
$Kết thúc của chuỗi
.Bất kỳ kí tự gì, ngoại trừ kí tự xuống dòng
*Tồn tại 0 hoặc nhiều hơn 0 ký tự
+Tồn tại ít nhất 1 ký tự
?Tồn tại 0 hoặc 1 ký tự
|Hoặc
( )Nhóm
[ ]Một tập các ký tự
{ }Mức độ lạp lại
\Đánh dấu cho kí tự đặc biệt


Sử dụng ký tự đặc biệt với \

Single characters
\tký tự tab
\nđánh dấu dòng mới
\rký tự trả về đầu dòng (CR)
\xhhký tự có mã hex là hh


Matching
\wBất kì một ký tự thuộc nhóm chữ số, chữ cái và dấu "_"
\WCác ký tự không phải là từ (Không phải số, chữ cái và dấu "_")
\sBất kỳ ký tự trắng nào (bao gồm dấu cách, tab và đánh dấu đầu dòng)
\SKhông thuộc nhóm ký tự trắng
\dBất kỳ ký tự là chữ số [0-9]
\DBất kỳ ký tự nào không phải là chữ số

Ví dụ

a*Tồn tại 0 hoặc nhiều hơn các ký tự a
a+Tồn tại ít nhất một ký tự a
a?Tồn tại 0 hoặc 1 ký tự a
a{m}Có chính xác m ký tự a
a{m,}Có ít nhất 1 a
a{m,n}Có ít nhất m nhưng không có nhiều quá n ký tự a
repetition?(?)

Tập ký tự nằm trong [...]

Different meanings apply inside a character set (“character class”) denoted by [...] so that, instead of the normal rules given here, the following apply:
[characters]Bất kỳ kí tự nào nằm trong dấu ngoặc vuông
[x-y]Bất kỳ ký tự nào nằm ở giữa ký tự x và y ở trong bảng chữ cái
[\-]Ký tự “-
[\n]Tương ứng với ký tự bắt đầu dòng mới
[^something]Bất kỳ ký tự nào trừ những ký tự nằm trong ngoặc vuông



Ví dụ

expressionmatches...
abcabc (tìm chính xác cụm từ abc trong vị trí bất kì của xâu) 
^abcabc nằm ở đầu chuỗi
abc$abc nằm ở cuối chuỗi
a|bhoặc a hoặc b
^abc|abc$Bắt đầu hoặc kết thúc bằng chuỗi abc
ab{2,4}cchuỗi tìm kiếm bắt đầu bằng a, theo sau là 2 tới 4 ký tự b và kết thúc bằng c
ab{2,}cchuỗi tìm kiếm bắt đầu bằng a, theo sau là có ít nhất 2 ký tự b và kết thúc bằng c
ab*cchuỗi tìm kiếm bắt đầu bằng a, theo sau có thể có hoặc không có b và kết thúc bằng c
ab+cChuối tìm kiếm bắt đầu bằng a, theo sau có ít nhất 1 ký tự b và kết thúc bằng c
ab?cChuỗi tìm kiếm bắt đầu bằng a, theo sau là 0 hoặc 1 b và kết thúc bằng c
a.cChuỗi tìm kiếm bắt đầu bằng a, theo sau là bất kì ký tự nào ngoại trừ dấu đánh dấu bắt đầu dòng mới và kết thúc bằng c
a\.ctìm chuỗi a.c 
[abc]Bất kỳ ký tự nào trong a, b và c
[Aa]bchoặc là Abc hoặc abc
[abc]+chuỗi có chứa bất kỳ (không trống) các ký tự nào trong a, b và c
[^abc]+Bất kỳ chuỗi có chứa (không trống) các ký tự không phải là a, b và c
\d\dbất kỳ chuỗi số có 2 chữ số
\w+chuỗi có ít nhất một ký tự là chữ số, chữ cái và dấu "_"
100\s*mkLà sâu bắt đầu bằng chuỗi 100, theo sau là 0 hoặc nhiều ký tự trắng và kết thúc bằng chuỗi mk
abc\babc when followed by a word boundary (e.g. in abc! but not in abcd)
perl\Bperl when not followed by a word boundary (e.g. in perlert but not in perl stuff)

Bàn thêm về cụm ký tự nằm trong dấu ():

  • Nhóm ký tự nằm trong dấu () dùng để phân nhóm chuỗi, ví dụ như kiểu xâu chỉ định có khớp với nhóm (a) hay (b) hay không.
  • Xem thêm tại: http://stackoverflow.com/questions/3512471/what-is-a-non-capturing-group

Xem thêm tại: https://www.cs.tut.fi/~jkorpela/perl/regexp.html

2 nhận xét:

  1. Cấu trúc "Không chứa":
    http://www.regular-expressions.info/lookaround.html
    - Sử dụng cặp (?!) để tạo luật không chứa

    Trả lờiXóa
  2. Regex in java:
    http://www.vogella.com/tutorials/JavaRegularExpressions/article.html

    Trả lờiXóa