đồng phục nghi thức đội

Tìm hiểu String và Regular Expressions(Regex) Trong C#

August 20, 2011 | All, C#

I.Introduction

- String là kiểu dữ liệu được sử dụng nhiều nhất trong lập trình, hầu như trong các ứng dụng trên Web hay Windows đề sử dụng String rất nhiều.

- Biểu thức chính qui – Regex là 1 chuổi biểu thức dùng làm khuông mẫu để so sánh các chuổi khác có khớp với nó hay không .

- Việc thấm nhuần về String là điều hết sức quan trọng trong lập trình.

- Trong bài này mình xin chia sẻ về cách sử dụng String cũng như Regex trong ngôn ngữ lập trình C#.

II.Fundamental

1.String :

a. Cách khai báo và tạo 1 chuổi :

String str = "phamnguyen.info";

 

string strings = "pham nguyen";

 

- Về mặt sử dụng khi chúng ta khai báo bằng String hay string là hoàn toàn như nhau.

- Ngoài ra chúng ra có thể khởi tạo String từ một mảng char :

// Khoi tao mang ky tu

char[] chars = {'c','s','h','a','r','p'};

// Khoi tao chuoi bang mang ky tu

string str = new string(chars);

// Ket qua khi xuat str se duoc : csharp

- Để biết độ dài của một chuổi ta dùng thuộc tính Length:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Sample

{

    class Program

    {

        static void Main(string[] args)

        {

            String str = "pham phuong nguyen";

            Console.WriteLine("Độ dài chuổi: {0}",str.Length);

        }

    }

}

// Kết quả : Độ dài chuổi: 18 

 

 

-  Ngoài ra để chuyển kiểu 1 kiểu dữ liệu nào đó về String chúng ta dùng phương thức ToString() :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Sample

{

    class Program

    {

        static void Main(string[] args)

        {

            

            int Number = 10;

            String Str = Number.ToString();

            Console.WriteLine("Number is " + Str);

        }

    }

}

// Kết quả: Number is 10

 

b. Các Thao tác trên String :

- Có rất nhiều thao tác trên String , ở đây mình xin liệt kê một số thao tác thường sử dụng :

Phương thức

Ý nghĩa

Compare() So sánh 2 chuổi (chuổi 1 ? chuổi 2) = (-1,0,1) tương ứng với (<,=,>)
Concat() Nối chuổi
EndsWith() Xem chuổi kết thúc bằng 1 nhóm ký tự xác định hay không
IndexOf() tìm vị trí xuất hiện đầu tiên của 1 chuổi con trong 1 chuổi lớn
Insert() Trả về 1 chuổi mới đã được chèn thêm
LastIndexOf() Trả về vị trí xuất hiện cuối cùng của 1 chuổi con trong 1 chuổi lớn
Length Chiều dày của chuổi
Remove() Xóa đi 1 chuổi con
Replace() Thay thế 1 chuổi cũ bằng chuổi mới
Split() Trả về vị trí chuổi con đượng phân định ký tự xác định
StartsWith() Xem chuổi có bắt đầu bằng 1 nhóm ký tự nhác định hay không
Substring() Lấy chuổi con.
ToUpper() Trả về bản sao của chuổi kiểu In Hoa
ToLower() Trả về bản sau của chuổi kiểu thường

Sau đây mình có 1 Sample đơn giản để minh họa cho String :

- Tạo 1 Windows Form đơn giản

Kết quả :

C# Code :

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace StringSample

{

    public partial class StringDemo : Form

    {

        String StringOne;

        String StringTwo;

        public StringDemo()

        {

            InitializeComponent();

            this.btn_COMPARE.Click += new EventHandler(btn_COMPARE_Click);

            this.btnCompare.Click += new EventHandler(btnCompare_Click);

            this.btnConcat.Click += new EventHandler(btnConcat_Click);

            this.btnExit.Click += new EventHandler(btnExit_Click);

            this.btnIndexOf.Click += new EventHandler(btnIndexOf_Click);

            this.btnInsert.Click += new EventHandler(btnInsert_Click);

            this.btnReplace.Click += new EventHandler(btnReplace_Click);

            this.btnSubstring.Click += new EventHandler(btnSubstring_Click);

        }

 

        void btnSubstring_Click(object sender, EventArgs e)

        {

            StringOne = txtStringOne.Text;

            StringTwo = txtStringTwo.Text;

            int i = StringOne.IndexOf(StringTwo);

            lblKetQua.Text = StringOne.Substring(i);

        }

        /// <summary>

        /// Thay thế chuổi 2 trong chuổi một bằng 1 chuổi khác

        /// 

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void btnReplace_Click(object sender, EventArgs e)

        {

            StringOne = txtStringOne.Text;

            StringTwo = txtStringTwo.Text;

            int i = StringOne.IndexOf(StringTwo);

            String text = "Microsoft";

            lblKetQua.Text = StringOne.Replace(StringTwo, text);

        }

 

        void btnInsert_Click(object sender, EventArgs e)

        {

            StringOne = txtStringOne.Text;

            StringTwo = txtStringTwo.Text;

 

        }

 

        void btnIndexOf_Click(object sender, EventArgs e)

        {

            StringOne = txtStringOne.Text;

            StringTwo = txtStringTwo.Text;

            int Index = StringOne.IndexOf(StringTwo);

            lblKetQua.Text = "Vị trí tìm thấy chuổi 2 trong chuổi 1"

            + Index.ToString();

        }

 

        void btnExit_Click(object sender, EventArgs e)

        {

            this.Close();

        }

 

        void btnConcat_Click(object sender, EventArgs e)

        {

            StringOne = txtStringOne.Text;

            StringTwo = txtStringTwo.Text;

            lblKetQua.Text = String.Concat(StringOne, StringTwo);

        }

        /// <summary>

        /// So Sánh 2 chuổi phân biệt chư thường chữ Hoa

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void btnCompare_Click(object sender, EventArgs e)

        {

            StringOne = txtStringOne.Text;

            StringTwo = txtStringTwo.Text;

            int kq = String.Compare(StringOne, StringTwo);

            lblKetQua.Text = txtStringOne.Text;

            if (kq == -1)

                lblKetQua.Text += " < ";

            else if (kq == 1)

                lblKetQua.Text += " > ";

            else

                lblKetQua.Text += " = ";

            lblKetQua.Text += txtStringTwo.Text;

        }

        /// <summary>

        /// So Sánh 2 cuổi không phân biệt chữ thường chử hoa

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void btn_COMPARE_Click(object sender, EventArgs e)

        {

            StringOne = txtStringOne.Text;

            StringTwo = txtStringTwo.Text;

            int kq = String.Compare(StringOne, StringTwo,true);

            lblKetQua.Text = txtStringOne.Text;

            if (kq == -1)

                lblKetQua.Text += " < ";

            else if (kq == 1)

                lblKetQua.Text += " > ";

            else

                lblKetQua.Text += " = ";

            lblKetQua.Text += txtStringTwo.Text;

        }

    }

}

 

2.Regex

- Trong thực tế chúng ta thường thấy các trang Web dùng Regex để kiểm tra định dạng của 1 chuổi Input xem có hợp lệ hay ko, thường là khi đăng ký account nào đó, nếu định dạng ko khớp với định dạng cho trc thì hệ thống sẽ thông báo, như email chẳng hạn, nếu chúng ta quy định là email phải có @….Com, thì hiển nhiên khi đăng ký mà ko có chữ @ hệ thống sẽ báo lỗi ngay.

- VD dau đây để so khớp định dạng chuổi Email :

String pattern = "^(\w+@\w+\.\w+)$";

- Biểu thức chính quy được xây dựng dựa vào ký tự đại diện và những nguyên tắc sau :

  • Ký tự đại diện
    • [0-9] hay \d: đại diện 1 ký tự số từ 0 – 9
    • [0-9a-zA-Z_] hay \w: Đại diện ký tự aphabet hay ký tự gạch chân(hoa thường).
    • .(dấu chấm): đại diện ký tự bất kỳ.
    • \s : đại diện ký tự trắng (\r\n\t\f)
    • [xyz] đại diện 1 ký tự x,y hặc z.
    • \D: đại diện ký tự không thuộc \d
    • \W : đại diện ký tự không thuộc \w
    • [^xyz]: đại diện ký tự không thuộc xyz.
    • ^: chỉ ra ký tự bắt đầu
    • $: chỉ ra ký tự kết thúc
    • \\,\.,\$,\^: đại diện ký tự ‘\,’.’,’$’,’^’.
  • Số lần xuất hiện :
    • {n,m}: ít nhất n lần, nhiều nhất m lần
    • {,m}: nhiều nhất m lần
    • {n,}: ít nhất n lần
    • {n}: chính xác n lần
    • ?: tương đương {0,1}
    • * : tương dương {0,vô cùng}
    • + : tương đương {1,vô cùng}
    • KHÔNG CHỈ ĐỊNH: 1 lần
  • Ví dụ :
// Số chứng minh nhân dân 9 ký tự

String cmnd = "[0-9]{9}";

 

// số điện thoại 10 số hay 11 số 

// bắt đầu bằng 0

String PhoneNumber = "0\d{9,10}";

 

// Số xe máy Sài Gòn : VD như 51-Z8-111.11

String MotoNumber = "5\d-[A-Z]\d-\d{3}.\d{2}";

 

// Địa chỉ Email

String Email = "\w+.@\w+.\w{2,4}";

- Khi đã hiểu được cách lập biểu thức chính qui chúng ta có thể kiểm tra một chuổi bất kỳ  xem có đúng định dạng hay không, cách đơn giản nhất là dùm phương thức IsMach().

bool Regex.IsMach(String input,String Pattern);

 

- Ví dụ :

// Kiểm tra định dạng chuổi nhập vào là Email

String EmailPattern = "\w+.@\w+.\w{2,4}";

String input = "[email protected]"

// Nếu như chuổi không hợp lệ

if(!Regex.IsMatch(input,EmailPattern))

{

    // Do Somethings

}

else 

{

    //

}

- Một điều cần lưu ý là để sử dụng Regex chúng ta phải khai báo namespace  System.Text.RegularExpressions trước.

III. Advanced

Để hiểu rõ hơn về String và Regex chúng ta cùng nhau làm 1 Demo đơn giản là nhập các thông tin như họ tên, sử thích, ngày sinh, email, CMND và sau đó lưu ra file .

Kết quả :

C# Code :

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Text.RegularExpressions;

using System.IO;

 

namespace SearchAndReplace

{

    public partial class RegexDemo : Form

    {

        public RegexDemo()

        {

            InitializeComponent();

        }

        private void btnSave_Click(object sender, EventArgs e)

        {

            if (String.IsNullOrEmpty(txtHo.Text) || String.IsNullOrEmpty(txtTen.Text))

                lblWarning.Text = "khong de trong ho va ten";

            else if ((DateTime.Now.Year - dtpNgaySinh.Value.Year) < 20)

                lblWarning.Text = "tuoi nhan vien ko duoc duoi 20";

            else if (double.Parse(txtLuong.Text) < 9000000)

                lblWarning.Text = "Luong toi thieu la 9tr";

            else if (!Regex.IsMatch(txtSoCMND.Text, @"^([0-9]{9})$"))

                lblWarning.Text = "So CMND ko hop le";

            else if (!Regex.IsMatch(txtEmail.Text, @"^(\w+@\w+\.\w+)$"))

                lblWarning.Text = "Email ko hop le";

            else if (!Regex.IsMatch(txtMobile.Text, @"^(0\d{9,10})$"))

                lblWarning.Text = "So Phone ko hop le";

            else if (!Regex.IsMatch(txtSoXeMay.Text, @"^(5\d-[A-Z]\d-\d{3}\.\d{2})$"))

                lblWarning.Text = "So Xe ko hop le";

            else

            {

                String dingdang = "Ho va Ten: {0} \r\nNgay Sinh:"

                +"{1: MMMM dd, yyyy} \r\nLuong: {2:c} \r\nSoThich {3}";

 

                String hoten = String.Concat(txtHo.Text, txtTenDem.Text, txtTen.Text);

                DateTime ngaysinh = dtpNgaySinh.Value;

                double luong = double.Parse(txtLuong.Text);

                String[] MangSoThich = new String[lstSoThich.SelectedItems.Count];

                for (int i = 0; i < lstSoThich.SelectedItems.Count; i++)

                {

                    MangSoThich[i] = lstSoThich.SelectedItems[i].ToString();

                }

                String SoThich = String.Join(", ",MangSoThich);

                String thongtin = String.Format(dingdang, hoten, ngaysinh, luong,SoThich);

                MessageBox.Show(thongtin);

                String TenFile = "C:/NhanVien.txt";

                File.WriteAllText(TenFile,thongtin);

            }

 

        }

    }

}

 

Download Source Code Here !

- Chúc các bạn thành công

/*Life run on code*/

Related posts:

Số liệu kinh ngạc về Firefox 4, phần mềm "đám mây" của Microsoft trình làng
Bill Gates bán 5 triệu cổ phiếu làm từ thiện
Imagine Cam ứng dụng chụp ảnh đẳng cấp Việt

Tags: , , ,

Comments (4)

 

  1. dtrthi says:

    thx, lâu nay coi mà ko rõ, lần này chắc rõ dc sơ sơ :D

  2. SangNguyenThanh says:

    Anh ơi có thể cho em 1 ví dụ regex sử dụng ^ và $. Ở trên anh nói là dùng để chỉ ra kí tự bắt đầu, kết thúc nhưng trong các ví dụ về pattern cho cmnd, phonenumber … chưa thấy anh sử dụng. Cái ^ và $ là option hả anh tức là mình không thêm mà C# vẫn hiểu kí tự bắt đầu và kí tự kết thúc là gì à?
    Cảm ơn anh vì bài viết rất hay!

Leave a Reply


4 + = six

Flickr Digg Yahoo! Technorati MySpace Delicious RSS