Viblo Code
0

Ruby Regular Expression

Regular Expression

Regular Expression: (viết tắt là regexp, regex hay regxp) là một chuỗi miêu tả một bộ các chuỗi khác, theo những quy tắc cú pháp nhất định. nó thường được dùng trong các trình biên tập văn bản và các tiện ích tìm kiếm và xử lý văn bản dựa trên các mẫu được quy định.

Nhiều ngôn ngữ lập trình cũng hỗ trợ biểu thức chính quy (Regular Expression) trong việc xử lý chuỗi. ví dụ như Perl, JavaScript, Ruby, AWK,Tcl,

Và một số khác thông qua một thư viện chuẩn. ví dụ như ngôn ngữ .NET, Java, Python, POSIX CC++ (kể từ C++11).

Hầu hết các ngôn ngữ đều cung cấp regular expressions thông qua các thư viện.

Mục đích chính của việc sử dụng regular expression là để kiểm tra tính hợp lệ của dữ liệu đầu vào. như việc kiểm tra địa chỉ email, số điện thoại, mật khẩu....

Ưu điểm: regular expression hoạt động theo kiểu so khớp chuỗi, trả về nếu dữ liệu là so khớp nên ta chỉ cần viết một biểu thức dùng làm mẫu có thể kiểm tra đảm bảo được dữ liệu đầu vào một loạt các trường hợp dữ liệu hợp lệ. Do đó regular expression giúp giảm thiều thời gian và công sức khi lập trình.

Nhược điểm: việc sử dụng để viết một regular expression không phải là dễ nó đòi hỏi người viết phải nắm bắt tốt được các quy tắc cơ bản để viết một biểu thức và quá trình tư duy logic để viết ra một biểu thức mẫu chính xác áp dụng cho trường hợp tổng quát. Dẫn đến nếu viết không tốt có thể cho ra những regular expression không phù hợp với expression muốn tìm, hoặc số văn bản tìm được với regualar expression đó không phù hợp…

Regular Expression In Ruby

Trong ruby mọi thứ đều là object vì vậy regular expression cũng là một object. Để tìm hiểu về regular expression trong ruby đầu tiên cần biết được Metacharacter cơ bản trong ruby và hiểu về Pattern.

Metacharacter: mỗi character trong regular expression được hiểu là một metacharacter hay một regular character.

Các metacharacter cơ bản sau thường được sử dụng:

^  - Matches beginning of line
$  - Matches end of line
\A - Matches beginning of string.
\Z - Matches end of string. If string ends with a newline, it matches just before newline
\z - Matches end of string
\G - Matches point where last match finished
\b - Matches word boundaries when outside brackets; backspace (0x08) when inside brackets
\B - Matches non-word boundaries
/./  - Any character except a newline.
/./m - Any character (the m modifier enables multiline mode)
/\w/ - A word character ([a-zA-Z0-9_])
/\W/ - A non-word character ([^a-zA-Z0-9_]).
/\d/ - A digit character ([0-9])
/\D/ - A non-digit character ([^0-9])
/\h/ - A hexdigit character ([0-9a-fA-F])
/\H/ - A non-hexdigit character ([^0-9a-fA-F])
/\s/ - A whitespace character: /[ \t\r\n\f]/
/\S/ - A non-whitespace character: /[^ \t\r\n\f]/
*     - Zero or more times
+     - One or more times
?     - Zero or one times (optional)
{n}   - Exactly n times
{n,}  - n or more times
{,m}  - m or less times
{n,m} - At least n and at most m times

Một regular expression thường được gọi là một pattern.

Một pattern luôn luông được giới hạn bởi dấu /.

ví dụ:

pattern = /ruby/ or pattern = /[0-9a-z]/

Một số kiểm tra cơ bản cho regular expression hay pattern là:

Phương thức match: Kiểm tra xem dữ liệu đưa vào có phù hợp với pattern mẫu hay không.

Nó sẽ trả về nil nếu ở đó không có kết quả phù hợp và trả về một đối tượng MatchData trong trường hợp ngược lại.

Có thể sử dụng match trong các câu lệnh điều kiện (vi dụ như if...else...)

Ví dụ:

 string = "Ruby 1 Regular Expression !!!"
 pattern = /\w+ \d{1}/
 pattern1 = /ruby/

 match = pattern.match(string)
    //=> #<MatchData "Ruby 1">
 match1 = pattern1.match(string)
    //=> nil

 match.post_match
   //=> " Regular 2 Expression 3 !!!"
 match.pre_match
   //=> ""

Có thể dùng để tụe viết các regular expression khác ở đây: http://rubular.com/ || http://www.regexplanet.com/advanced/ruby/index.html

=~ (the equals-tilde operator) Trả về vị trí bắt đầu của nó trong chuỗi, ví dụ:

string = "Ruby Regular Expression"

/Ruby/ =~ string
   //=> 0
/y/=~string
  //=> 3
/regular/=~string
  //=> nil
/Regular/=~string
  //=> 7

Regular expression use: sub, sub!, gsub, gsup! để thao tác với chuỗi

Ví dụ:

string = "Ruby Regular Expression"

str = string.sub /Expression/, "Expressions"
=> return string: "Ruby Regular Expression"
       str: "Ruby Regular Expressions"
str1 = string.sub! /Expression/, "Expressions"
=> return string: "Ruby Regular Expressions"
       str1: "Ruby Regular Expressions"

tương tự sub, chỉ khác gsub thay thế toàn bộ những gì là phù hợp
str2 = string.gsub /R/, "r"
=> return string: "Ruby Regular Expression"
       str2: "ruby regular Expression"

"0976123456".sub /(\d{4})(\d{3})(\d{3})/,'(\1) \2-\3'
=> "(0976) 123-456"

Trong nội dung bài viết chỉ trình bày những gì cần thiết để hiểu và viết một regular expression trong ruby.

Để tìm hiểu sâu hơn nững kỹ thuật của regular expression có thể xem ở một số trang sau: https://en.wikipedia.org/wiki/Regular_expression || http://ruby-doc.org/core-2.2.3/Regexp.html


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.