Thứ Tư, 30 tháng 12, 2009

Bitmap/Vector into firefly particles AS3.0

Thứ Hai, 28 tháng 12, 2009

tween lite

Contents

thủ thuật

control userpasswords2
Bổ sung một số tính năng mở rộng vào bên trong menu ngữ cảnh là việc làm vô cùng tiện ích, giúp tiết kiệm thời gian tương tác và qua đó, cải thiện hiệu suất làm việc của bạn với máy tính. Sau đây, TTCN xin hướng dẫn các bạn cách thêm các mục gồm: Command Prompt, Copy the content  to clipboard, CopyTo, MoveTo vào menu ngữ cảnh trong Windows 7.
Các thủ thuật chuẩn bị nói dưới đây đều tác động tới Registry, do đó các bạn hãy sao lưu các thiết đặt Regis mặc định để phòng trường hợp rắc rối hệ thống xảy ra.

Thêm tùy chọn "Command Prompt in This Folder"

Nhấp tổ hợp phím "Windows+R" để mở hộp thoại Run, tại đây nhập ‘regedit’ để mở cửa sổ Registry.
Điều hướng tới HKEY_CLASSES_ROOT\Directory\shell và tạo một Key mới trong shell. Các bạn đặt tên cho Key này là "Command Prompt".
Tại bảng bên phải, nhấp chuột phải lên giá trị "Default" và chọn "Modify". Tại trường "Value data" nhập "Command Promt here".
Tương tư trên các bạn tạo Key mới dưới "Command Prompt" và đặt tên nó là "command".
Tương tác với command, tại cửa sổ bên phải các bạn cũng nhấp chuột phải lên giá trị "Default" và chọn "Modify", nhập "cmd.exe /k cd %1" tại trường "Value data".
Giờ đóng cửa sổ Registry lại và kiểm tra kết quả thu được.

Thêm tùy chọn "Copy the content to clipboard"

Mở cửa sổ Registry, điều hướng tới HKEY_CLASSES_ROOT\txtfile\shell, tạo Key mới dưới shell và đặt tên là "Copy to clipboard". Tương tự Modify với "Default" và nhập "Copy the content  to clipboard" cho "Value data".
Lần nữa tạo Key và đặt tên cho Key là "command" nằm dưới "Copy to clipboard". Nhấp chuột phải lên "Default" chọn Modify ,nhập "cmd /c clip < “%1” " tại trường "Value data".
Đóng cửa sổ Registry và kiểm tra kết quả.

Thêm tùy chọn "CopyTo"

Điều hướng tới: HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers từ cửa sổ Registry.
Nhấp chuột phải lên ContextMenuHandlers và chọn "New->Key”. Đặt tên cho Key là "CopyTo".
Nhấp đúp chuột lên giá trị "Default" bên phải, tại trường "Value data" nhập mã: {C2FBB630-2971-11D1-A18C-00C04FD75D13}.

Thêm tùy chọn "MoveTo"

Tương tự tạo Key và đặt tên là "MoveTo" dưới ContextMenuHandlers, nhập mã: {C2FBB631-2971-11D1-A18C-00C04FD75D13} cho trường "Value data".

NHIẾP PHONG

NHIẾP PHONG
Nhân vật trong Phong Vân phải nói là rất nhiều ,từ tập 1 cho đến tập 100,nhân vật xuất hiện liên miên ,chỉ có 3 nhân vật không bị chết,đó là :Nhiếp Phong ,Bộ Kinh Vân và Vô Danh .Ngoài ra đều chết hoặc không xuất hiên.

[/ipg]
Là một trong hai nhân vật chính của truyện .Nhiếp Phong là con trai của "Bắc Ẩm Cuồng Đao" Nhiếp Nhân Vương,tu vị đao pháp thuộc hàng cao thủ nhưng vì tình mà hóa cuồng .

Thứ Năm, 24 tháng 12, 2009

sniplet

_gradientColor1 = uint(input);
r1 = (_gradientColor1 >>16) & 0xFF;
g1 = (_gradientColor1 >>8) & 0xFF;
b1 = _gradientColor1 & 0xFF;

filtersCo=r1<<16|g1<<8|b1

Have you tried “Math.atan2″ method to detect angle between the points?
This returns in radians but you can multiply by “180 / Math.PI” for degree rotation.
function angleOfPoints(a:Point, b:Point):Number
{
var dx:Number = a.x-b.x;
var dy:Number = a.y-b.y;
var rad:Number = Math.atan2(dy, dx);
return rad;
}
stage.scaleMode = StageScaleMode.NO_SCALE;

Thứ Tư, 16 tháng 12, 2009

Date

You can get current date and/or time in Java using the following method. You may change the date format in the constructor of SimpleDateFormat to get the result in a different format:
    import java.util.Date;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;

    private String getDateTime() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        return dateFormat.format(date);
    }





import java.util.Calendar;
import java.text.SimpleDateFormat;

public class DateUtils {
  public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";

  public static String now() {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
    return sdf.format(cal.getTime());

  }

  public static void  main(String arg[]) {
    System.out.println("Now : " + DateUtils.now());
  }
}

Here some formatting possibilities available through the SimpleDateFormat class.

import java.util.Calendar;
import java.text.SimpleDateFormat;

public class DateUtils {


  public static String now(String dateFormat) {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    return sdf.format(cal.getTime());

  }

  public static void  main(String arg[]) {
     System.out.println(DateUtils.now("dd MMMMM yyyy"));
     System.out.println(DateUtils.now("yyyyMMdd"));
     System.out.println(DateUtils.now("dd.MM.yy"));
     System.out.println(DateUtils.now("MM/dd/yy"));
     System.out.println(DateUtils.now("yyyy.MM.dd G 'at' hh:mm:ss z"));
     System.out.println(DateUtils.now("EEE, MMM d, ''yy"));
     System.out.println(DateUtils.now("h:mm a"));
     System.out.println(DateUtils.now("H:mm:ss:SSS"));
     System.out.println(DateUtils.now("K:mm a,z"));
     System.out.println(DateUtils.now("yyyy.MMMMM.dd GGG hh:mm aaa"));
  }
}

Thứ Ba, 15 tháng 12, 2009

Inspector

import java.lang.reflect.*;

public class MethodInspector {
    public static void main(String[] arguments)  {
        Class inspect;
        try {
            if (arguments.length > 0)
                inspect = Class.forName(arguments[0]);
            else
                inspect = Class.forName("MethodInspector");
            Method[] methods = inspect.getDeclaredMethods();
            for (int i = 0; i < methods.length; i++) {
                Method methVal = methods[i];
                Class returnVal = methVal.getReturnType();
                int mods = methVal.getModifiers();
                String modVal = Modifier.toString(mods);
                Class[] paramVal = methVal.getParameterTypes();
                StringBuffer params = new StringBuffer();
                for (int j = 0; j < paramVal.length; j++) {
                    if (j > 0)
                        params.append(", ");
                    params.append(paramVal[j].getName());
                }
                System.out.println("Method: " + methVal.getName() + "()");
                System.out.println("Modifiers: " + modVal);
                System.out.println("Return Type: " + returnVal.getName());
                System.out.println("Parameters: " + params + "\n");
            }
        } catch (ClassNotFoundException c) {
            System.out.println(c.toString());
        }
    }
}

Using Runtime.exec()

Using Runtime.exec()

This example will capture the output (from stdio) of an external program.

Thứ Hai, 14 tháng 12, 2009

regular Expressions

A quick note about these two assertions, let's start with positive lookahead:

"Assert that the regex below can be matched, starting at this position".

Let's go with this little example:

Regex:
\s+\w+(?=\.)

This would mean, match a space between one and many times followed by a word character between one an many times only if there is a dot following the previous match:

Eg.
andy mypass ok orange..see what is going on

The matched text here would be orange (Because there was a dot after "orange", ah yes, and many spaces before).

Now, let's go with the other case, negative lookahead:
"Assert that it is impossible to match the regex below starting at this position".
The regex changes to
\s+\w+(?!\.)

Do you see the difference?. this should read now:

Match a space between one and many times followed by a word character between one and many times only if the following character is not a dot, so what is matched now using our previous example:


mypass (Because after "mypass" was a space)
ok (Same reason using the word "ok")
orang (Because after "orang" there is an e)
see (Because after "see" there is a space)
.... and so on

Thứ Hai, 7 tháng 12, 2009

Horizontal Scrolling Menu

Horizontal Scrolling Menu made with CSS and jQuery

There are a lot of cool flash scrolling menus out there, but I decided to make a similarly looking menu with just CSS and jQuery. I couldn’t achieve the same smoothness in animation, but anyway I’m really satisfied with the result. My menu works fine in all major browsers and degrades gracefully when Javascript is turned off.

Thứ Tư, 18 tháng 11, 2009

JavaFX

Ứng dụng và slide giới thiệu javafx cho thực tập nhận thưc

Thứ Hai, 16 tháng 11, 2009

Code TH JAVA phần 1

Code Th_Java của tui bài 13 trở về sau edit lại của J bài 6 thì mới đầu code như sau
   public String[] tenSo_arr = { "Không", "Một", "Hai", "Ba", "Bốn", "Năm", "Sáu",
           "Bảy", "Tám", "Chín" };
   public String[] donVi_arr = { "", "Mười", "Trăm" };
   public String[] donViKhong_arr = { "", "Lẻ", "" };
   public String[] donViNgan_arr = { "", "Ngàn", "Triệu", "Tỷ"};
public String docSoSangChu(long so) {
       StringBuffer strBuff = new StringBuffer();
       int i = 0, j = 0, k = 0;
       long tmp = so;
       int prev=0;//so truoc so hien tai 1 so
       boolean check=false; //kiem tra xem da doc so nao !0 chua
       while (tmp != 0) {
           i = (char) (tmp % 10);
           if(i!=0) check=true;
           if (j == 3) {// neu bang 3 tang he so don vi *1000
               j = 0;
               if(k==3)k=1;else k++;
               strBuff.insert(0, " " + donViNgan_arr[k]);
           }
           // doc don vi
           if (i != 0||(j==2&&check)) {
               strBuff.insert(0, " " + donVi_arr[j]);
           } else {
                   if(prev!=0)strBuff.insert(0, " " + donViKhong_arr[j]);//han che doc khi co 2 so ko lien tuc
               }  
           // doc chu so
           // neu bang ko thi ko doc hoac neu =1 vd 211 thi doc 2 tram muoi mot
           // nen ko can doc
           if ((i!=0||(j==2&&check))&& !(i == 1 && j == 1)) {
               strBuff.insert(0," "+ tenSo_arr[i]);
           }
           tmp = tmp / 10;
           j++;
           prev=i;
       }
       return strBuff.toString();

   }
cái này đọc số nhỏ cũng tốt nhưng số lớn hơi chuối nên chuyển qua code này
package Phan1;

public class bai6 {
 // main
 public int[] a;
 public String[] tenSo_arr = { "Không", "Một", "Hai", "Ba", "Bốn", "Năm", "Sáu",
   "Bảy", "Tám", "Chín" };
 public String[] donViNgan_arr = { "", "Ngàn", "Triệu", "Tỷ"};

 public static void main(String[] args) {
   bai6 b = new bai6();
   System.out.println(b.docSoSangChu("190000001"));
   System.out.println(b.docSoSangChu("1900000000"));
   System.out.println(b.docSoSangChu("90000"));
   System.out.println(b.docSoSangChu("1001001"));
   System.out.println(b.docSoSangChu("1000001"));
   System.out.println(b.docSoSangChu("100"));
   System.out.println(b.docSoSangChu("2111"));
   System.out.println(b.docSoSangChu("551231"));
   System.out.println(b.docSoSangChu("199999999999900"));

  do {
   try {
    System.out.println(b.docSoSangChu(Libary.NhapString(" nhap so can doi")));
   } catch (NumberFormatException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
  } while (Libary.IsContinue());

 }

 public String docSoSangChu(String str)throws NumberFormatException {
  System.out.print(str+" :");
  StringBuffer strBuff = new StringBuffer();
  int currentValue = 0, k = 0,j=0;
  Boolean check=false;//kiem tra xem da doc so nao khac ko chua
  Boolean check2=false;//kiem tra xem da doc so nao khac ko trong bo 3 so chua
  for (int i = str.length()-1; i>=0; i--,j++) {
   currentValue=str.charAt(i)-48;
   if(currentValue!=0) check=check2=true;
   if(currentValue <0&¤tValue>9) throw new NumberFormatException(" Ko phai la so");
   switch (j) {
   case 2:
    if(currentValue==0){
    if(check2)
     strBuff.insert(0, " "+ tenSo_arr[0]+" Trăm");
    check2=false;
    }
    else strBuff.insert(0, " Trăm");
    break;
   case 1:
    if(currentValue==0){
     if(str.charAt(i+1)!=48) strBuff.insert(0, " lẻ");
    }else if (currentValue==1){
     strBuff.insert(0, " Mười");
     continue;
    }else {
     strBuff.insert(0, " Mươi");
    }
    break;
   case 3 :
    if(k==3){
     k=1;check=false;
    }k++;
    j=0;
    
    if(currentValue!=0){
     strBuff.insert(0, " "+ donViNgan_arr[k]);
    }else {
     if(check){
      if(  (i-2)>=0&&str.charAt(i-1)==48&& str.charAt(i-2)==48){
       strBuff.insert(0, " "+ tenSo_arr[0]+" "+ donViNgan_arr[k]);
      }else {
       strBuff.insert(0, " "+ donViNgan_arr[k]);
      }
     }else {
      if(  (i-2)<0){
       strBuff.insert(0, " "+ donViNgan_arr[k]);
      }else if (str.charAt(i-1)!=48|| str.charAt(i-2)!=48){
       strBuff.insert(0, " "+ donViNgan_arr[k]);
      }
     }
    } 
   case 0: 
    if(currentValue==1 &&(i-1)>=0&&str.charAt(i-1)!=48&&str.charAt(i-1)!=49){
     strBuff.insert(0, " Mốt");
     continue;
    }
    break;
   }
   if(currentValue!=0) {
    
   strBuff.insert(0," " +tenSo_arr[currentValue]);
   }
   
  }
  
  return strBuff.toString();
 }
}


Đọc rất chi là pro
190000001 : Một Trăm Chín Mươi Triệu Không Ngàn Không Trăm lẻ Một
1900000000 : Một Tỷ Chín Trăm Triệu
90000 : Chín Mươi Ngàn
1900 : Một Ngàn Chín Trăm
1000001 : Một Triệu Không Ngàn Không Trăm lẻ Một
100 : Một Trăm
2111 : Hai Ngàn Một Trăm Mười Một
551231 : Năm Trăm Năm Mươi Mốt Ngàn Hai Trăm Ba Mươi Mốt
199999999999900 : Một Trăm Chín Mươi Chín Triệu Chín Trăm Chín Mươi Chín Tỷ Chín Trăm Chín Mươi Chín Triệu Chín Trăm Chín Mươi Chín Ngàn Chín Trăm
Đây là code phần 1
bài 6 mình có sửa 1 tí các bạn lấy code thì update lại nhé Code

Thứ Ba, 10 tháng 11, 2009

Các hàm cho Unicode chữ Việt

Dưới đây là Listing của một Sub và 13 hàm (Functions) dùng để xử lý Unicode chữ Việt. Ðể hiểu thêm về Unicode và nhất là cách hoán chuyển giữa UTF-16 và UTF-8 xin đọc bài Căn bản Unicode cho VB6 Programers. http://www.vovisoft.com/unicode/UniFunctions.htm

Thứ Sáu, 30 tháng 10, 2009

Dynamic Class

Dynamic Class
private var forCompiler:Person;

private function cc():void

{

        var obj:Object = createInstance("Person", ["bob", 30]);<br>
}

public function createInstance(className:String, args:Array):Object<br>
{<br>

        var myClass:Class = getDefinitionByName(className) as Class;
        var instance:Object = new myClass();
        instance.initArgs.apply(null, args);
        return instance;
}

/*********************************************************************

//In person.initArgs()....

//Note: the constructor also accepts name & age, assigning them default values

//if not specified.

public function initArgs(name:String, age:uint):void

{

        this.name = name;

        this.age = age;

}

***
function listProperties(obj:Object, accessType:String="readwrite", excludeCommonWith:Class=null, matchesRE:RegExp=null, declaredOnlyByObjClass:Boolean=true):Array
{
 var a:XMLList;
 var b:Array=[];
 var c:*;
 var n:int;
 var doc:XML;
 var cname:String;
 matchesRE=matchesRE || new RegExp(".+");
 accessType=accessType || "readwrite";
 accessType=accessType.toLowerCase();
 if (!RegExp(/readwrite|readonly/i).test(accessType)) {
  accessType == "readwrite";
 }
 doc=flash.utils.describeType(obj);
 cname=doc.@name;
 if (declaredOnlyByObjClass) {
  a=doc.accessor.(@access == accessType && @declaredBy == cname && matchesRE["test"](@name));
 } else {
  a=doc.accessor.(@access == accessType && matchesRE["test"](@name));
 }
 if (excludeCommonWith != null) {
  c=new excludeCommonWith();
 }
 n=0;
 while (n < a.length())
 {
  if (c != null) {
   if (Object(c).hasOwnProperty(a[n].@name) == false) {
    b.push(a[n].@name);
   }
  } else {
   b.push(a[n].@name);
  }
  n++;
 }
 return b;
}


http://keith-hair.net/blog/2009/12/08/listing-class-properties-dynamically-in-as3/#more-119

Regular Expression trong .Net

Regular Expression trong .Net

1. Giới thiệu: RE là một ngôn ngữ cực mạnh dùng mô tả văn bản cũng như thao tác trên văn bản. Một RE thường được ứng dụng lên một chuỗi, nghĩa là lên một nhóm ký tự. Chẳng hạn, ta có chuỗi sau: Mot, Hai, Ba, Bon, NEVERLAND. Bạn có thể trả về bất cứ hoặc tất cả các chuỗi con của nó (Hai hoặc Bon chẳng hạn) hoặc thay đổi phiên bản của những chuỗi con của nó (Mot hoặc BoN chẳng hạn). Một RE là một kiểu mẫu văn bản gồm 2 phần: literal (trực kiện) và metacharacters (ký tự siêu).

  • Một literal đơn thuần chỉ là một ký tự (a-z) mà bạn muốn đem so khớp với chuỗi đích.
  • Metacharacters là một ký tự đặc biệt hoạt động như là 1 mệnh lệnh đối với bộ phận phân tích ngữ nghĩa (parser) của RE

Bây giờ chúng ta thử tạo một regular expression như sau:

  1. ^(From|To|Subject|Date):
RE này sẽ khớp với bất cứ chuỗi con nào miễn là chuỗi này là một hàng mới bắt đầu với “From” hoặc “To” hoặc các chữ “Subject” hoặc “Date” (Dấu ^ nghĩa là bắt đầu 1 hàng mới) chuỗi này kết thúc bởi dấu hai chấm (:). Dấu ^ cho bộ parser của RE biết chuỗi mà ban đang truy tìm phải bắt đầu bởi một hàng mới. Các chữ “From”, “To”,.. là những literal, và những metacharacter “(“, “)”, và “|” được dùng để tạo nhóm literal và cho biết bất cứ những lựa chọn nào cũng phải khớp. Dấu ^ cũng là metacharacter, nó cho biết là khởi đầu 1 hàng. Do đó, bạn đọc hàng sau đây: ^(From|To|Subject|Date): Như sau: “cho khớp bất cứ chuỗi con nào bắt đầu bởi một hàng mới theo sau bởi bất cứ 4 chuỗi literal: From,To,Subject và Date rồi theo sau bởi dấu hai chấm2. Các ký tự siêu thường dùng (vô cùng quan trọng cần phải nắm) . : đại diện cho 1 ký tự bất kỳ trừ ký tự xuống dòng \n. \d : ký tự chữ số tương đương [0-9] \D : ký tự ko phải chữ số \s : ký tự khoảng trắng tương đương [ \f\n\r\t\v] \S : ký tự không phải khoảng trắng tương đương [ ^\f\n\r\t\v] \w : ký tự word (gồm chữ cái và chữ số, dấu gạch dưới _ ) tương đương [a-zA-Z_0-9] \W : ký tự không phải ký tự word tương đương [^a-zA-Z_0-9] ^ : bắt đầu 1 chuỗi hay 1 dòng $ : kết thúc 1 chuỗi hay 1 dòng \A : bắt đầu 1 chuỗi \z : kết thúc 1 chuỗi | : ký tự ngăn cách so trùng tương đương với phép or (lưu ý cái này nếu muốn kết hợp nhiều điều kiện) [abc] : khớp với 1 ký tự nằm trong nhóm là a hay b hay c. [a-z] so trùng với 1 ký tự nằm trong phạm vi a-z, dùng dấu - làm dấu ngăn cách. [^abc] sẽ không so trùng với 1 ký tự nằm trong nhóm, ví dụ không so trùng với a hay b hay c. () : Xác định 1 group (biểu thức con) xem như nó là một yếu tố đơn lẻ trong pattern .ví dụ ((a(b))c) sẽ khớp với b, ab, abc. ? : khớp với đứng trước từ 0 hay 1 lần. Ví dụ A?B sẽ khớp với B hay AB. * : khớp với đứng trước từ 0 lần trở lên . A*B khớp với B, AB, AAB + : khớp với đứng trước từ 1 lần trở lên. A+B khớp với AB, AAB. {n} : n là con số, Khớp đúng với n ký tự đúng trước nó . Ví dụ A{2}) khớp đúng với 2 chữ A. {n, } : khớp đúng với n ký tự trở lên đứng trước nó , A{2,} khớp vói AA, AAA ... {m,n} : khớp đùng với từ m->n ký tự đứng trước nó, A{2,4} khớp vói AA,AAA,AAAA
3. Các lớp để thao tác với Regular Expression trong .NET: .NET cung cấp một cách tiếp cận hướng đối tượng về việc so khớp chuỗi và thay thế theo RE. System.Text.RegularExpression là namespace trên thư viện các lớp chuẩn của .NET liên quan đến tất cả các đối tượng gắn liền với RE. Sau đây mình xin giới thiệu sơ lược về các lớp này: 1.Regex: Lớp Regex tượng trưng cho 1 regular expression bất di bất dịch (read-only). Nó cũng chứa một phương thức tĩnh (static) cho phép chúng ta sử dụng những lớp rex khác mà khỏi khởi tạo 1 đối tượng khác. Ví dụ:
  1. string pattern = @"\s2000";
  2. Regex myRegex = new Regex(pattern);
Sau đây, mình sẽ kể ra vài thành phần của lớp Regex này: -Thuộc tính: +Options: trả về những mục chọn được trao qua cho constructor Regex. +RightToLeft: nhận 1 trị cho biết liệu xem regular expression dò tìm từ phải qua trái hay không -Phương thức: +GetGroupNames: trả về mảng gồm toàn tên nhóm thu lượm đối với RE. +GetGroupNumbers: trả về mảng gồm toàn số nhóm thu lượm tương ứng với tên nhóm trên 1 mảng. +GroupNameFromNumber: đi lấy tên nhóm tương ứng với số nhóm được khai báo. +IsMatch: trả về trị bool cho biết liệu xem RE có tìm thấy một so khớp hay không trên pattern. +Match: dò tìm trên pattern xem có xuất hiện một RE hay không rồi trả về kết quả chính xác như là một đối tượng Match duy nhất. +Matches: dò tìm trên pattern xem tất cả các xuất hiện của một RE có hay không rồi trả về tất cả những so khớp thành công xem như Match được gọi nhiều lần. +Replace: cho thay thế những xuất hiện của một pattern được định nghĩa bởi một RE bởi một chuỗi ký tự thay thế được chỉ định. +Split: chẻ một pattern thành một mảng gồm những chuỗi con ở những vị trí được chỉ định bởi một so khớp trên RE +Unescape: cho unescape bất cứ những ký tự nào được escape trên pattern. Sau đây là ví dụ sử dụng lớp Regex để tách chuỗi qua việc dùng phương thức Split của nó:
  1. string chuoi = "Mot, Hai, Ba, Bon, NEVERLAND.";
  2. //tạo pattern
  3. //luật: xem chuỗi nào có chứa khoảng trắng hay dấu phẩy
  4. string pattern = " |, ";
  5. Regex myRegex = new Regex(pattern);
  6. string[] sKetQua = myRegex.Split(chuoi);
  7. foreach (string subString in sKetQua)
  8. {
  9. Console.WriteLine(subString);
  10. }
Và đây là kết quả của nó:
  1. Mot
  2. Hai
  3. Ba
  4. Bon
  5. NEVERLAND.
Như bạn thấy , phương thức khởi tạo của class Regex sẽ nhận 1 chuỗi pattern làm đối số. Phương thức Regex.Split() hoạt động cũng giống như String.Split(), trả về 1 mảng chuỗi như là kết quả việc so khớp pattern của RE trong lòng myRegex. 2.Lớp Match: Lớp này tượng trưng cho những kết quả duy nhất của một tác vụ so khớp (match) RE. Sau đây mình có 1 ví dụ nhỏ sử dụng phương thức Match của lớp Regex để trả về 1 đối tượng kiểu Match để có thể tìm ra so khớp đầu tiên trên chuỗi nhập. Sử dụng thuộc tính Match.Access của lớp Match báo cho biết liệu xem đã tìm ra 1 so khớp hay chưa.
  1. string chuoi = "123abcd456bdabc";
  2. string pattern = "abc";
  3. Regex myRegex = new Regex(pattern);
  4. Match m = myRegex.Match(chuoi);
  5. if (m.Success)
  6. {
  7. Console.WriteLine("Tim thay chuoi con {0} o vi tri thu {1} trong chuoi", m.Value, m.Index);
  8. }
  9. else
  10. Console.WriteLine("Khong tim thay chi ca");
Kết quả như sau:
  1. Tim thay chuoi con abc o vi tri thu 3 trong chuoi

3.Lớp MatchCollection Lớp này tượng trưng cho 1 loạt những so khớp thành công đè chồng lên nhau tạo thành một tập hợp bất di bất dịch và lớp này không có phương thức khởi tạo. Nhũng đối tượng MatchCollection sẽ do thuộc tính Regex.Matches của lớp Regex trả về. Hiểu nôm na MatchCollection là mảng các đối tượng Match là được. Ví dụ:

  1. static void Main(string[] args)
  2. {
  3. //tập hợp chứa những so khớp
  4. MatchCollection mc;
  5. //1 chuỗi thử nghiệm
  6. string chuoi = "I like money, like woman and like C#";
  7. //tạo pattern
  8. string pattern = "like";
  9. //khởi tạo 1 đối tượng của Regex
  10. //truyền chuỗi pattern vào constructor
  11. Regex myRegex = new Regex(pattern);
  12. //dùng phương thức Matches của myRegex
  13. //để tìm ra matches và chỉ mục của từng match
  14. mc = myRegex.Matches(chuoi);
  15. foreach (Match m in mc)
  16. {
  17. Console.WriteLine("Chuoi con '{0}' xuat hien o chi muc {1}", m.Value, m.Index);
  18. }
  19. }

Ta có kết quả sau:

  1. Chuoi con 'like' xuat hien o chi muc 2
  2. Chuoi con 'like' xuat hien o chi muc 14
  3. Chuoi con 'like' xuat hien o chi muc 29

Sử dụng Regex Match Collections: Hai thuộc tính của đối tượng Match là chiều dài và vị trí của nó, mà ta có thể đọc như ví dụ sau:

  1. static void Main(string[] args)
  2. {
  3. //tập hợp chứa những so khớp
  4. MatchCollection mc;
  5. //1 chuỗi thử nghiệm
  6. string chuoi = "This is a example string.";
  7. //tạo pattern
  8. //luật:cho tìm ra bất cứ những ký tự không phải ký tự khoảng trắng
  9. //rồi theo sau nó là kí tự khoảng trắng
  10. string pattern = @"\S+\s";
  11. //khởi tạo 1 đối tượng của Regex
  12. //truyền chuỗi pattern vào constructor
  13. Regex myRegex = new Regex(pattern);
  14. //dùng phương thức Matches của myRegex
  15. //để tìm ra matches và chỉ mục của từng match
  16. mc = myRegex.Matches(chuoi);
  17. for (int i = 0; i < mc.Count; i++)
  18. {
  19. Console.WriteLine("The match[{0}]: '{1}' co chieu dai la {2}", i,mc[i].Value, mc[i].Length);
  20. }

Chuỗi \S đi tìm những ký tự không phải khoảng trắng, và dấu + cho biết một hoặc nhiều ký tự ở đằng sau. Còn \s (s thường nhá) cho biết là khoảng trắng. Do đó, gộp lại ta có mệnh đề “hãy đi tìm bất cứ ký tự non-whitespace theo sau bởi whitespace”. Kết quả của ví dụ trên là:

  1. The match[0]: 'This ' co chieu dai la 5
  2. The match[1]: 'is ' co chieu dai la 3
  3. The match[2]: 'a ' co chieu dai la 2
  4. The match[3]: 'example ' co chieu dai la 8

Lý do từ chót “string.” không được tìm thấy là vì nó có kết thúc là dấu chấm (không phải khoảng trắng).

4.Lớp Group Đôi khi người ta cho là rất tiện khi cho gộp lại những biểu thức con so khớp với nhau như vậy bạn có thể phân tích ngữ nghĩa những đoạn của chuỗi khớp. Ví dụ, có thể bạn muốn so khớp dựa trên địa chỉ IP và cho gộp lại tất cả các IP tìm thấy được bất cứ nơi nào trên đoạn chuỗi. Lớp Group cho phép bạn tạo những nhóm so khớp dựa trên cú pháp RE, và tượng trưng cho kết quả từ 1 biểu thức gộp nhóm duy nhất. Một biểu thức gộp nhóm đặt tên cho một nhóm v2 cung cấp 1 RE; bất cứ chuỗi con nào khớp với RE sẽ được đưa vào nhóm. Ví dụ, muốn tạo 1 nhóm IP, bạn có thể viết một RE cho biết một hoặc nhiều digit hay dot theo sau bởi space như sau:
  1. @”(?<ip>(\d|\.)+)\s”
Lớp Match được dẫn xuất từ Group, và có một tập hợp mang tên Groups chứa tất cả các nhóm mà Match tìm thấy. Lớp Group tượng trưng cho những kết quả thu hoạch được từ 1 thu lượm nhóm duy nhất. Ví Group có thể thu lượm 0, 1 hoặc nhiều chuỗi chữ trong một lần so khớp duy nhất, nó chứa một tập hợp gồm những đối tượng của Capture. Vì Group kế thừa từ Capture, substring bị thu lượm có thể được truy xuất trực tiếp. Các thể hiện của Group sẽ được trả về bởi thuộc tính Match.Groups(số group) hoặc Match.Groups(“tên group”) nếu cấu trúc gộp nhóm “(?<groupname>)” được dùng đến. Ví dụ sau đây sử dụng kiến trúc gộp nhóm lồng nhau để thu lượm những chuỗi con gộp thành nhóm:
  1. static void Main(string[] args)
  2. {
  3. string pattern = "(a(b))c";
  4. string chuoi = "abdabc";
  5. //định nghĩa những substring abc,ab,b
  6. Regex myRegex = new Regex(pattern);
  7. Match m = myRegex.Match(chuoi);
  8. for (int i = 0; m.Groups[i].Value != ""; i++)
  9. {
  10. Console.WriteLine("{0} co chieu dai {1}", m.Groups[i].Value, m.Groups[i].Length);
  11. }
  12. }
Kết quả:
  1. abc co chieu dai 3
  2. ab co chieu dai 2
  3. b co chieu dai 1
Đoạn mã sau đây sử dụng kiến trúc gộp nhóm có mang tên (name và value) để thu lượm những substrings từ một chuỗi chứa dữ liệu trên 1 dạng thức “DATANAME:VALUE” mà RE bị chẻ ở dâu dấu hai chấm (:)
  1. static void Main(string[] args)
  2. {
  3. string pattern = @"^(?<name>\w+):(?<value>\w+)";
  4. Regex myRegex = new Regex(pattern);
  5. Match m = myRegex.Match("Section:119900");
  6. for (int i = 0; m.Groups[i].Value != ""; i++)
  7. {
  8. Console.WriteLine("{0} co chieu dai {1}", m.Groups[i].Value, m.Groups[i].Length);
  9. }
  10. }
Kết quả:
  1. Section:119900 co chieu dai 14
  2. Section co chieu dai 7
  3. 119900 co chieu dai 6
RE sẻ trả về kết xuất sau đây:
  1. m.Groups[“name”].Value = “Section1”
  2. m.Groups[“value”].Value = “119900
Sử dụng cụ thể lớp Group:
  1. static void Main(string[] args)
  2. {
  3. //một chuỗi ví dụ
  4. string chuoi = "04:03:27 127.0.0.0 caulacbovb.com";
  5. //group time = một hoặc nhiều digit hoặc dấu hai chấm
  6. //theo sau bởi khoảng trắng
  7. string timePattern = @"(?<time>(\d|\:)+)\s";
  8. string ipPattren = @"(?<ip>(\d|\.)+)\s";
  9. string sitePattern = @"(?<site>\S+)";
  10. string pattern = timePattern + ipPattren + sitePattern;
  11. Regex myRegex = new Regex(pattern);
  12. //đi lấy tập hợp những so khớp
  13. MatchCollection matches = myRegex.Matches(chuoi);
  14. foreach (Match match in matches)
  15. {
  16. if (match.Length != 0)
  17. {
  18. Console.WriteLine("\nMatch: {0}", match.ToString());
  19. Console.WriteLine("\nTime: {0}", match.Groups["time"]);
  20. Console.WriteLine("\nIP: {0}", match.Groups["ip"]);
  21. Console.WriteLine("\nSite: {0}", match.Groups["site"]);
  22. }
  23. }
  24. }
Kết quả:
  1. Match: 04:03:27 127.0.0.0 caulacbovb.com
  2. Time: 04:03:27
  3. IP: 127.0.0.0
  4. Site: caulacbovb.com
Theo ví dụ trên, đầu tiên ta tạo một chuỗi để tiến hành dò khớp:
  1. string chuoi = "04:03:27 127.0.0.0 caulacbovb.com";
Chuỗi này có thể là 1 trong nhiều chuỗi được ghi nhận trên một tập tin log của web server như là kết quả dò tìm của CSDL. Trong ví dụ đơn giản này có 3 cột: time – IP – Site, mỗi cột cách nhau bởi một khoảng trắng. Bạn muốn tạo một đối tượng Regex duy nhất để dò tìm những chuỗi kiểu này, và chặt chúng thành 3 nhóm: time,ip và site :
  1. string timePattern = @"(?<time>(\d|\:)+)\s";
  2. string ipPattren = @"(?<ip>(\d|\.)+)\s";
  3. string sitePattern = @"(?<site>\S+)";
  4. string pattern = timePattern + ipPattren + sitePattern;
  5. Regex myRegex = new Regex(pattern);
Ta tập trung xem các ký tự hình thành nhóm: Các dấu ngoặc () sẽ tạo nên một nhóm. Những gì nằm giữa dấu ngoặc mở (ngay trước dấu ?) và dấu ngoặc đóng (sau dấu + trong trường hợp này) là 1 nhóm đơn độc chưa mang tên.
  1. @"(?<time>(\d|\:)+)\s"
  • Chuỗi ?<time> đặt tên nhóm là time và nhóm gắn liền với đoạn văn bản so khớp, là regular expression “(\d|\:)+)\s”. RE này ược suy diễn như sau: “một hoặc nhiều digit hoặc dấu hai chấm theo sau bởi khoảng trắng”.
  • Chuỗi ?<ip> đặt tên cho nhóm ip, và ?<site> đặt tên cho nhóm site.
Như các ví dụ trước, ví dụ trên cũng đòi hỏi một tập hợp của tát cả các đoạn khớp:
  1. MatchCollection matches = myRegex.Matches(chuoi);
Tiếp theo, cho đi xuyên qua tập hợp matches để lôi ra từng phần tử match của nó:
  1. foreach (Match match in matches)
Nếu chiều dài Length của match lớn hơn 0 có nghĩa là đã tìm thấy một so khớp. Sau đó, thì cho in ra toàn bộ những mục so khớp:
  1. Console.WriteLine("\nMatch: {0}", match.ToString());
Tiếp theo, là đi lấy nhóm time từ tập hợp Groups của match rồi cho in ra nội dung:
  1. Console.WriteLine("\nTime: {0}", match.Groups["time"]);
Kết quả
  1. Time: 04:03:27
Tương tự như thế với các nhóm site và ip ta có kết quả
  1. IP: 127.0.0.0
  2. Site: caulacbovb.com
5.Lớp GroupCollection: Là lớp tượng trưng cho 1 tập hợp gồm toàn những nhóm được thu lượm và trả về một lô những nhóm được thu lượm trong một lần so khớp duy nhất. Collection này thuộc loại read-only và không có phương thức khởi tạo. Các thể hiện của lớp GroupCollection được trả về trong tập hợp mà thuộc tính Match.Groups trả về. Ví dụ: dò tìm và in ra số những nhóm được thu lượm bởi một RE. Làm thế nào để trích từng thu lượm riêng rẽ trên mỗi thành viên của môt group collection.
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. namespace ConsoleApplication1
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. Regex myRegex = new Regex("(a(b))c");
  12. Match m = myRegex.Match("abdabc");
  13. Console.WriteLine("So nhom duoc tim thay la: {0}",m.Groups.Count);
  14. }
  15. }
  16. }
Kết quả:
  1. 1. So nhom duoc tim thay la 3
6.Lớp Cature: Lớp này chứa những kết quả từ một thu lượm duy nhất dựa trên một expression-con (sub-expression) 7.Lớp CatureCollection: Mỗi lần một đối tượng Regex khớp với một subexpression, một thể hiện Capture sẽ được tạo ra, và được thêm vào tập hợp CaptureCollection. Mỗi đối tượng Capture tượng trưng cho một thu lượm (capture) đơn lẻ. Mỗi nhóm sẽ có riêng cho mình một capture collection những mục khớp với subexpression được gắn liền với nhóm. Lớp CaptureCollection tượng trưng cho một loạt những chuỗi con được thu lượm và trả về một lô những thu lượm được thực hiện chỉ qua một nhóm thu lượm duy nhất. Thuộc tính Captures, một đối tượng của lớp CaptureCollection, được cung cấp như là một thành viên của các lớp Match và Group giúp truy xuất dễ dàng lô các chuỗi con được thu lượm. Ví dụ: nếu bạn sử dụng regular expression ((a(b)c)+ (dấu + cho biết là một hoặc nhiều chuỗi so khớp) để thu lượm những so khớp từ chuỗi chữ “abcabcabc”. CaptureCollection đối với mỗi matching Group của những substring sẽ chứa 3 thành viên. Ví dụ sau đây mình dùng đến regular expression (Abc)+ để tìm ra một hoặc nhiều so khớp trên chuỗi “XYZAbcAbcAbcXYZAbcAb”. Ví dụ minh họa việc sử dụng thuộc tính Captures để trả về nhiều nhóm các chuỗi con bị thu lượm:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. namespace ConsoleApplication1
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. string chuoi = "XYZAbcAbcAbcXYZAbcAb";
  12. string pattern = "(Abc)+";
  13. Regex myRegex = new Regex(pattern);
  14. Match m = myRegex.Match(chuoi);
  15. GroupCollection gc = m.Groups;
  16. CaptureCollection cc;
  17. Console.WriteLine("So nhom thu luom duoc = {0}",gc.Count.ToString());
  18. Console.WriteLine();
  19. for(int i=0;i<gc.Count;i++)
  20. {
  21. cc = gc[i].Captures;
  22. Console.WriteLine("So capture = " + cc.Count.ToString());
  23. for(int j=0;j< cc.Count;j++)
  24. {
  25. Console.WriteLine(cc[j] + " bat dau tu ky tu " + cc[j].Index);
  26. }
  27. Console.WriteLine();
  28. }
  29. }
  30. }
  31. }
Kêt quả
  1. So nhom thu luom duoc = 2
  2. So capture = 1
  3. AbcAbcAbc bat dau tu ky tu 3
  4. So capture = 3
  5. Abc bat dau tu ky tu 3
  6. Abc bat dau tu ky tu 6
  7. Abc bat dau tu ky tu 9
Sử dụng lớp CaptureCollection: Thuộc tính chủ chốt của đối tượng Capture là Length, cho biết chiều dài của chuỗi con bị thu lượm. Khi bạn yêu cầu Match cho biết chiều dài, thì chính Capture.Length bạn tìm thấy, vì Match được thừa kế từ Group, và Group lại được dẫn xuất từ Capture. Điển hình, bạn sẽ chỉ tìm thấy một Capture đơn độc trong mộg CaptureCollection; nhưng điều này không buộc phải như thế. Điều gì sẽ xảy ra nếu bạn phân tích ngữ nghĩa một chuỗi trong ấy tên công ty có thể xuất hiện hoặc ở hai nơi. Muốn gộp các tên này vào chung thành một match đơn lẻ, bạn tạo nhóm ?<company> ở 2 nơi trong pattern của regular expression.
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. namespace ConsoleApplication1
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. string chuoi = "05:04:27 NEVERLAND 192.168.10.1 TNHH";
  12. string pattern = @"(?<time>(\d|\:)+)\s" +
  13. @"(?<company>\S+)\s" +
  14. @"(?<ip>(\d|\.)+)\s" +
  15. @"(?<company>\S+)";
  16. Regex myRegex = new Regex(pattern);
  17. MatchCollection mc = myRegex.Matches(chuoi);
  18. foreach(Match match in mc)
  19. {
  20. if (match.Length!=0)
  21. {
  22. Console.WriteLine("Match: {0}",match.ToString());
  23. Console.WriteLine("Time: {0}",match.Groups["time"]);
  24. Console.WriteLine("IP: {0}",match.Groups["ip"]);
  25. Console.WriteLine("Company: {0}",match.Groups["company"]);
  26. Console.WriteLine();
  27. foreach(Capture cap in match.Groups["company"].Captures)
  28. {
  29. Console.WriteLine("cap: {0}",cap.ToString());
  30. }
  31. }
  32. }
  33. }
  34. }
  35. }
Đoạn mã sau cho rảo qua tập hợp Capture đối với nhóm company:
  1. foreach(Capture cap in match.Groups["company"].Captures)
Compiler bắt đầu bằng cách tìm ra tập hợp mà ta rảo qua trên ấy. match là một đối tượng có một tập hợp mang tên Groups. Tập hợp Groups có bộ chỉ mục (indexer) cho phép trích một chuỗi và trả về một đối tượng Group đơn lẻ. Do đó, lệnh sau đây trả về một đối tượng Group đơn lẻ:
  1. match.Groups["company"].Captures
Đến phiên, vòng lặp foreach rảo qua tập hợp Captures, trích mỗi phần tử trong tập hợp và gán cho biến toàn cục cap, thuộc kiểu dữ liệu Capture. Bạn có thể là trên kết xuất có 2 phần tử capture: NEVERLAND và TNHH. Phần tử thứ hai đè chồng lên phần tử đầu trên nhóm, do đó chỉ in ra TNHH, nhưng khi quan sát tập hợp Captures thì bạn thấy có 2 trị bị thu lượm. Kết quả của ví dụ trên:
  1. Match: 05:04:27 NEVERLAND 192.168.10.1 TNHH
  2. Time: 05:04:27
  3. IP: 192.168.10.1
  4. Company: TNHH
  5. cap: NEVERLAND
  6. cap: TNHH

Xử lý chuỗi

1. Tách chuỗi nằm giữa 2 từ

  1. using System.Text.RegularExpressions; //Namespace cần thiết
  2. public String[] Tachchuoigiua2tu(String ChuoiGoc, String Tu1, String Tu2)
  3. {
  4. String varParttern = Tu1 + "[^" + Tu2 + "]*" + Tu2;
  5. Regex objRegex = new Regex(varParttern, RegexOptions.Multiline);
  6. MatchCollection objMatch = objRegex.Matches(ChuoiGoc);
  7. String[] Ketqua = new String[objMatch.Count];
  8. for(int i=0; iCount;i++)
  9. {
  10. Ketqua[i] = objMatch[i].Value.Replace(Tu1,"").Replace(Tu2,"");
  11. }
  12. return Ketqua;
  13. }

Cách sử dụng

  1. private void btnTestParttern_Click(object sender, EventArgs e)
  2. {
  3. String chuoi = "<<11111>>,<<22222>>,<<333333>>";
  4. String[] Ketqua = Tachchuoigiua2tu(chuoi, "<<", ">>");
  5. foreach (String s in Ketqua)
  6. {
  7. txtKetqua.Text += s + "\r\n";
  8. }
  9. }
  10. //////////////
  11. //Kết quả
  12. 11111
  13. 22222
  14. 33333

2. Tách các cụm số ra khỏi chuỗi

Ví dụ bạn cần tách các cụm số ra khỏi chuỗi sau :D abcsd123456asdhfkas4646546werwer78979

  1. String varParttern = @"\d+";
  2. String s = "abcsd123456asdhfkas4646546werwer78979";
  3. Regex objRegex = new Regex(varParttern, RegexOptions.Multiline);
  4. MatchCollection objMatch = objRegex.Matches(s);
  5. foreach (Match Temp in objMatch)
  6. {
  7. txtKetqua.Text += Temp.Value + "\r\n";
  8. }
  9. Kết quả
  10. 123456
  11. 4646546
  12. 78979

Tách các cụm số ra khỏi chuỗi (Cách 2)

  1. public string isNum(string s)
  2. {
  3. string kq;
  4. Regex objR = new Regex("[0-9]");
  5. MatchCollection objMatch = objR.Matches(s);
  6. foreach (Match Tmp in objMatch)
  7. {
  8. kq += Tmp.Value;
  9. }
  10. return kq;
  11. }