So mẫu (RegExp) trong javascript 2008-08-12 10:41:16

Đây là phần kiến thức cơ bản về so mẫu trong JS được thống kê lại để dễ tham khảo,về cơ bản thì so mẫu đều giống nhau chỉ khác nhau về hình thức trên từng ngôn ngữ lập trình, nên nếu bạn nắm tốt so mẫu trong js thì trong php cùng tương tự, hy vọng giúp ích cho các bạn
1. Cách khai báo so mẫu trong JS
a. var regexp = /pattern/flags
ví dụ: var re1 = /mac/i;
b. var regexp  =  new RegExp("pattern","flags");
ví dụ: var re2 = new RegExp("mac","g");
Ví dụ về so mẫu (VD 1)
<script>
str = 'mac is operator in mac PC';
var re1 = /mac/;
var re2 = new RegExp("mac","g");
alert('VD 1.1: '+str.replace(re1,'Test'));
alert('VD 2.2: '+str.replace(re2,'Test'));
</script>


2. Các giá trị của flag:
i: không phân biệt chữ hoa chữ thường
ví dụ: /The/i gồm  "the" và "The" và "tHe"
g: tìm tất cả các chuỗi thỏa so mẫu
Mặc định trong js, chỉ tìm phần tử đầu tiên ( ví dụ VD 1.1) , khi dùng flag "g" JS sẽ tìm tất cả trong chuỗi ( VD 1.2)
m: tìm trên nhiều dòng (JavaScript1.5+)


3. Các ký tự dùng trong so mẫu /pattern/
\ loại bỏ các ký tự đặc biệt trong so mẫu ( những ký tự
{n}:  chính xác n lần
ví dụ: /d{5}/ tìm những số có 5 chữ số
{n,}:  nhiều hơn n lần.
ví dụ: /d{5,}/ tìm những số có  5 chữ số trở lên
{n,m}: n đến m lần
ví dụ: /d{5,9}/ tìm những số có  5 đến 10 chữ số

(pattern) tìm và bắt lấy /pattern/
ví dụ: /(d).1/ thì 1 chính là giá trị đại diện của (d)
=> so mẫu này sẽ tìm chuỗi dạng /d.d/ ( tức dad,dbd,..)
(?:pattern) tìm nhưng không bắt lấy
ví dụ: /(?:d).1/ thì 1 chính không phải là đại diện của (d)
Lưu ý: (?:pattern) hổ trợ từ JavaScript 1.5.
| tìm thay phiên
ví dụ: /(a|b)a/ tìm những chuỗi aa hoặc ba.
[characters]: chứa bất kỳ ký tự characters
ví dụ: /[abcd]/( dạng ngắng /[a-d]/) tìm các ký tự 'a', 'b', 'c', 'd'
[^characters]: không chứa bất kỳ ký tự characters
ví dụ: /[^0-9]/ tìm tất cả các ký tự không phải là các ký tự số

* dạng ghi ngắn của {0,}
+ dạng ghi ngắn của {1,}
? dang ghi ngắn của {0,1}
^ điểm bắt đầu  (or new line with m  flag).
$ điểm kết thúc (or end of line with m flag).
. tìm bất kỳ ký tự nào trừ ký tự xuống dòng.


Alphanumeric: tìm chính xác các ký tự Alphanumeric
ví dụ:  /2 days/ sẽ tìm "2 days" trong chuỗi
\f matches form-feed.
\r matches carriage return.
\n matches linefeed.
\t ký tự tab (ngang).
\v ký tự tab (đứng).
\� tìm  ký tự NUL.
[\b] ký tự xóa.
\s những ký tự khoảng trắng (dạng ngắn của [\f\n\r\t\v\u00A0\u2028\u2029]).
S không phải là ký tự khoảng trắng (dạng ngắn của [^\f\n\r\t\v\u00A0\u2028\u2029]).
\w những ký tự là chữ,số hoặc _ (dạng ngắn của [a-zA-Z0-9_]).
\W những ký tự không là chữ, số hoặc _ (short for [^a-zA-Z0-9_]).
\d những ký tự số (dạng ngắn của [0-9]).
\D không phải là ký tự số (dạng ngắn của [^0-9]).
\b những ký tự boundary (vị trí giữa 1 từ và khoảng trắng).
\B không phải là ký tự boundary (dạng ngắn [^b]).
\cX ký tự Control. Ví dụ: cm tìm control-M.
\xhh tìm chuỗi ký tự hệ 16 dạng hh
\uhhhh tìm chuỗi ký tự unicode dạng hhhh.

4. Các cách sử dụng regexp
a. dùng method của string (str)
str.match(/pattern/ )  trả về 1 mảng các thông tin nếu tìm thấy và false nếu không tìm thấy /pattern/ trong str
ví dụ:
var str = "Watch out for the rock!";
a = str.match(/r?or?/g)// kết quả: a = ["o","or","ro"]

str.replace( /pattern/, replacement_text ) tìm và thay thế /pattern/ thành replacement_text
ví dụ:
var str = "Liorean said: My name is Liorean!".replace(/Liorean/g,'Big Fat Dork')
kết quả: str =  "Big Fat Dork said: My name is Big Fat Dork!"

str.split ( /pattern/ ) chia str thành 1 array
ví dụ:
var str = "I am confused".split(/s/g)
kết quả: str = ["I","am","confused"]

str.search(/pattern/) trả về vị trí đầu tiên của /pattern/ trong str và -1 nếu không tìm thấy
ví dụ:  
var str =  "Watch out for the rock!"
ndx = str.search(/for/) //kết quả : 10

b. dùng method và property của RegExp
+ method:
/pattern/.test(string) trả về true nếu /pattern/ tồn tại trong string và ngược lại
ví dụ: var match = /sample/.test("Sample text") // kết quả : false

/pattern/.exec(string) trả về array thông  nếu /pattern/ tồn tại trong string và ngược lại trả về false
ví dụ: var match = /s(amp)le/i.exec("Sample text") // kết quả ["Sample","amp"]

+ property:
$n: với 0< n < 9
ví dụ:
re  = /(Hello)(s+)(world)/ thì re.$2 chính là tất cả khoảng trắng nằm giữa Hello và world ( giá trị của (s+))

source: chứa bản copy của so mẫu
global: kiểm tra flag "g" trong so mẫu
ignoreCase: kiểm tra flag "i" trong so mẫu
lastIndex: vị trí ký tự đầu tiên của pattern tìm thấy cuối cùng trong str

Có một số chỗ không chính xác, anh em bổ sung thêm

Tra loi 6 comment(s) TG 2008-08-12 10:41:16

choncon 2008-08-14 03:23:00

ah mình đang nghĩ cách viết một biểu thức so mẫu cho một từ tiếng việt để viết code unikey ai có cách hay chỉ với nhé.Ví dụ như: (t|b|ng)?(a|â|o|ô)?(ng|n|m|c)? => kiểu kiểu như vậy ấy ,nguyên âm và phụ âm đầu và cuối ....

Tra loi

TG 2008-08-18 11:12:24

Nhưng mục đích của cái này cuối cùng dùng để làm gi ?

Tra loi

gaulucky92 2008-08-18 03:49:59

thôi! mốt cần thì copy lại :D điên cái đầu! chả hiểu gì hết! T_T

Tra loi

choncon 2008-08-18 08:02:59

thì là qui tắc bỏ dấu tiếng việt chứ sao ví dụ mình  kí tự cuối đánh vào textarea là s thì kiểm tra ít nhất 4 từ liền trước nó ví dụ : match(/ng(a|o)n/i) thì return lại là ngái hoặc ngói.Hiện nay ai cũng dùng HIM hết nhưng mình thấy HIM viết còn sơ sài và dài lại không chạy trên Safari.Qui tắc bỏ dấu của HIM cũng chưa hoàn hảo lắm .Mình đã giải quyết được trên Safari cũng viết được code nhưng muốn mọi người thử hỏi coi mọi người có giải thuật nào nhanh hơn không.

Tra loi

TG 2008-08-19 08:21:51

hehe, có vẻ hay để nghiên cứu thử xem :)

Tra loi

gaulucky92 2008-10-20 10:12:26

thấy có cái Mudim đang nổi lên, dùng rộng rãi ở các forum VBB... bạn xem thử thế nào? Nghe tác giả nói là phát triển từ CHIM của MrChuoi gì đó... có cả bảng so sánh giữa Mudim và các bộ gõ khác như AVIM, HIM,... ==> http://code.google.com/p/mudim/wiki/BangSoSanh
http://code.google.com/p/mudim/

Tra loi

Y kien