Liên hệ

Biểu thức chính quy RegExp

Cách viết biểu thức chính quy RegExp, sử dụng biểu thức chính quy trong lập trình

Biểu thức chính quy - Regular expression

Biểu thức chính quy là gì?

Biểu thức chính quy là một nhóm các ký tự, ký hiệu nó được sử dụng để tìm kiếm văn bản (text).

Một biểu thức chính quy là một mẫu nó tương đồng quy luật với một chuối từ trái qua phải. Biểu thức chính quy tên tiếng anh là Regular Expression gọi tắt là regex hoặc regexp

Trong lập trình nó được dùng với các hàm xử lý chuỗi, xử lý văn bản với các tác vụ cụ thể như: tìm và thay thế chuỗi, kiểm tra tính hợp lệ của dữ liệu, trích xuất chuỗi con từ một chuỗi ... Hầu hết các ngôn ngữ lập trình đều hỗ trợ Regex như PHP, C#, JAVA ...

Thử xem xét một ví dụ về Regex như sau: Giả sử bạn ứng dụng của bạn yêu câu người dùng phải tuân thủ quy tắc đặt tên (1)Tên được phép chứa các ký tự, các số, gạch dưới, gạch nối. (2) Tên phải có độ dài trong khoảng cho phép từ 3 đến 15 ký tự.. Thì biểu thức chính quy biểu diễn quy tắc đó sẽ như sau:

^[a-z0-9_-]{3,15}$

  • ^ Ký hiệu cho biết bắt đầu một dòng
  • [a-z0-9_-] Cho phép tên chứa ký tự a-z, số từ 0 - 9, ký tự -, ký tự _
  • {3,15} Tên dài 3 đến 15 ký tự
  • $ Điểm kết thúc dòng
  • Với biểu thức chính quy trên thì các tên như xuanthu, xuan-xhu, xuanxhu_123 ... được chấp nhận vì dài trong khoảng 3 - 15, chữ đều viết thường.

    Biểu thức cơ bản

    Một biểu thức Regex chỉ là một mẫu các ký tự dùng để tìm kiếm trong text (chuỗi). Ví thụ một biểu thức the có nghĩa phù hợp với nó là bắt đầu bằng t theo sau là h và tiếp theo là e mang biểu thức so với text thì thấy hợp mẫu như sau:

    "the" => current headlines from the US and around the world

    Biểu thức chính quy Regex là phân biệt chữ hoa chữ thường.

    Các ký tự biểu diễn - Meta

    Ký tự Meta Mô tả
    . Biểu diễn bất kỳ ký tự nào ngoài trừ ký tự xuống dòng
    [ ] Tập hợp ký tự. Phù hợp nếu có bất kỳ ký tự nào trong dấu []
    [^ ] Tập hợp ký tự phủ định. Phù hợp nếu không có ký tự nào trong []
    * Lặp lại 0 đến nhiều lần.
    + Lặp lại 1 hoặc nhiều lần
    ? Tùy chọn có hay không cho mẫu phía trước
    {n,m} Độ dài tối thiểu là n tối đa là m
    (xyz) Biểu diễn một nhóm.
    | Biểu diễn thay thế, phép toán or
    \ Biểu diễn ký tự đặc biệt [ ] ( ) { } . * + ? ^ $ \ |
    ^ Điểm bắt đầu của dòng.
    $ Điểm kết thúc của dòng

    Ký hiệu chấm .

    Ký hiệu dấu chấm . là một meta đơn giản, nó biểu diễn bất kỳ ký tự nào ngoài trừ ký tự return \r hoặc newline \n. Ví dụ biểu thức .gs thì có nghĩa là: một ký tự nào đó, tiếp theo đến ký tự g, tiếp theo đến s. Ví dụ dùng mẫu đó tìm trong chuỗi.

    ".ar" => Other recordings of this song.

    Tập hợp ký tự []

    Dùng [] để chứa tập hợp các ký tự. Có thể dùng dấu - để biểu diễn một dải các ký tự theo vị trí trong bảng chữ cái như a-z, 0-9 ..., biểu thức so sánh sẽ hợp mẫu nếu chứa bất kỳ ký tự nào trong đó (không cần quan tâm thứ tự)

    Ví dụ biểu thức [Tt]he có nghĩa là: Có một chữ T hoặc t, theo sau bởi h, tiếp theo là e

    [Tt]he => The Cat and the Mouse

    Nếu [] chứa . thì nó biểu diễn ký tự . chứ không con ý nghĩa đại diện như trường hợp trên.

    ay[.] => Cause you didn't want to stay.

    Tập hợp ngoại trừ [^]

    Thông thường thì ^ biểu diễn điểm bắt đầu của chuỗi, tuy nhiên nếu nó nằm ở vị trí sau dấu [ của cặp [] thì nó lại mang ý nghĩa tạo ra tập hợp ký tự loại trừ (phụ định). Ví dụ biểu thức [^C]ar có nghĩa là bất kỳ ký tự nào ngoại trừ ký tự C, theo sau bởi a, tiếp theo bởi r

    [^o]ve => When I say I love you, please believe it's true.

    Lặp lại với ký tự *

    Ký hiệu * cho biết có sự lặp lại 0 hoặc nhiều lần mẫu phù hợp phía trước nó. Ví dụ mẫu a* có nghĩa là ký tự a lặp lại 0 hoặc nhiều lần là phù hợp. Nếu nó đi sau tập hợp thì lặp hợp đó lặp lại 0 hoặc nhiều lần. ví dụ [a-z]* có nghĩa là bất kỳ ký tự viết thường nào trong dòng.

    * có thế sử dụng với . để biểu diễn bất kỳ chuỗi nào.
    * có thể sử dụng với ký tự trắng \s để biểu diễn bất kỳ khoảng trắng nào.
    Ví dụ \s*cat\s* có nghĩa bắt đầu bởi không hoặc nhiều khoảng trắng, tiếp theo là ký tự c, a, t tiếp theo là không hoặc nhiều khoảng trắng.

    "\s*cat\s*" => The fat cat sat on the concatenation.

    Lặp lại với ký tự +

    Ký hiệu + tương tự như * nhưng lặp lại 1 hoặc nhiều. Ví dụ
    c.+t có nghĩa ký tự c theo sau ít nhất một ký tự nào đó, tiếp theo là ký tự t.

    "c.+t" => The fat cat sat on the mat.

    Trong biểu thức Regex thông thường ? là một tùy chọn cho biết mẫu phía trước nó có thể có hoặc không. Ví dụ [T]?he nghĩa là tùy chọn có T hoặc không, theo sau là h, tiếp theo là e

    "[T]?he" => The car is parked in the garage.

    Biểu diễn độ dài {}

    {} là biểu diễn số lượng, nó chỉ ra số lần mà một ký tự hoặc một nhóm các ký tự lặp lại.
    Ví dụ [0-9]{2,3} có nghĩa là có tối thiểu 2 tới 3 ký tự số.

    Bạn có thể bỏ đi số thứ 2, ví dụ [0-9]{2,} có nghĩa là chuỗi có 2 hoặc nhiều ký tự số. Nếu bỏ đi ký tự , ví dụ [0-9]{3} có nghĩa là chuỗi chính xác có 3 ký tự.

    Nhóm mẫu (...)

    Nhóm ký tự là một mẫu con được viết biên trong (). Ví dụ (ab)* lặp lại ab 0 hoặc nhiều lần. Chúng ta cũng dùng ký hiệu | bên trong nhóm như là phép toán or để xác định nhóm. Ví dụ (c|g|p)ar có nghĩa là ký tự c hoặc g hoặc p theo sau là a, tiếp theo là r

    "(c|g|p)ar" => The car is parked in the garage.

    Biểu diễn thay thế |

    Xem ví dụ trên

    Biểu diễn ký tự đặc biệt với \

    Do một số ký hiệu đã được dùng đã biểu diễn Regex như : { } [ ] / \ + * . $ ^ | ? nên để biểu diễn các ký tự đó dùng ký hiệu \ trước ký tự.

    "(f|c|m)at\.?" => The fat cat sat on the mat.

    Bắt đầu của dòng ^

    Sử dụng ^ để cho biết sẽ kiểm tra sự phù hợp nếu ký tự đầu tiên của chuỗi hợp mẫu. Ví dụ ^a thì chuỗi phù hợp có dạng như abcxyz, nếu vẫn chuỗi đó nó lại không phù hợp với ^b.
    ^(T|t)he có nghĩa là T hoặc t bắt đầu của chuỗi, theo sau là he

    Điểm kết thúc của chuỗi $

    Ngược lại với ^ ví dụ (at\.)$ nghĩa là cuối chuỗi có at. thì là phù hợp.
    "(at\.)$" => The fat cat. sat. on the mat.

    Ký hiệu tắt cho tập hợp

    Viết tắt Diễn tả
    . Bất kỳ ký tự nào ngoại trừ xuống dòng
    \w Chữ,sô, và _, tương đương với: [a-zA-Z0-9_]
    \W Ngoài bảng chữ cái, tương đương với: [^\w]
    \d Các số: [0-9]
    \D Không phải số: [^\d]
    \s Là ký tự trắng, tương đương với: [\t\n\f\r\p{Z}]
    \S Không phải ký tự trắng: [^\s]

    Biểu thức ?= lookahead

    Ký hiệu là ?=. Phần đầu của biểu thức phải được tiếp nối bởi biểu thức lookahead.
    Ví dụ (T|t)he(?=\sfat) nghĩa là T hoặc t theo sau là he. Nhưng do có biểu thức lookahead, điều này thì kết quả phù hợp là The hoặc the từ biểu thức đầu có phần tiếp theo là trong chuỗi là fat

    "(T|t)he(?=\sfat)" => The fat cat sat on the mat.

    Biểu thức ?! phủ định lookahead

    Ký hiệu là ?!. Phần đầu của biểu thức không có theo sau biểu thức lookahead.

    "(T|t)he(?!\sfat)" => The fat cat sat on the mat.

    Biểu thức (?<=...) Lookbehind

    Sử dụng để lấy các phù hợp mà đi trước là một mẫu cũ thể. (?<=(T|t)he\s)(fat|mat) có nghĩa lấy tất cả các từ fat hoặc mat sau các từ The hoặc the
    "(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.

    Biểu thức (?<!...) phủ định Lookbehind

    Sử dụng để lấy các phù hợp mà đi trước là một mẫu cũ thể.
    "(?<!(T|t)he\s)(cat)" => The cat sat on cat.

    Các cờ

    Cờ Diễn tả
    i Thiết lập không phân biệt chữ hoa chữ thường
    g Tìm kiếm toàn chuỗi.
    m Multiline: Anchor meta character works on each line.

    Các cờ này được đưa vào mẫu theo dạng /RegExp/flags

    "/The/gi" => The fat cat sat on the mat.


    "/.(at)/" => The fat cat sat on the mat.

    "/.(at)/g" => The fat cat sat on the mat.

    "/.at(.)?$/gm" => The fat
    cat sat
    on the mat.

    Trong PHP các hàm sử dụng RegExp thường các biểu thức này nằm trong cặp /../

    Tác giả: https://twitter.com/ziishaned