Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > บทความจากสมาชิก > Regular Expression กับ .NET Framework



 
Clound SSD Virtual Server

Regular Expression กับ .NET Framework

Regular Expression กับ .NET Framework Regular Expression (เรียกย่อๆว่า RegEx หรือ RegExp) เป็นเรื่องนึงที่ผมได้เรียนรู้ในช่วงปริญญาตรี (ถ้าจำไม่ผิด น่าจะเป็นวิชา Compiler) แล้วก็ได้ใช้บ่อยพอสมควรเมื่อถึงเวลาทำงานจริงๆ เกือบทุกภาษาจะต้องมี RegEx ไลบรารี่ไม่ว่าจะเป็น C, C++, C#, Java หรือแม้แต่ JavaScript บางภาษาเช่น Perl หรือ Ruby นั้น RegEx เป็นส่วนหนึ่งของภาษาเลยทีเดียว

อธิบายง่ายๆ RegEx คือ รูปแบบที่ใช้เพื่อให้การค้นหา ตรวจสอบ หรือจับคู่ คำ ตัวอักษร ประโยค และอื่นๆ จาก string หรือ text รูปแบบที่สร้างขึ้นอาจจะเป็นแค่หาคำง่ายๆ หรือซับซ้อนขึ้นเช่นการตรวจสอบว่า string ที่ได้มาจากฟอร์มเป็นอีเมล์หรือเปล่า

ยกตัวอย่างเช่น ถ้าผมต้องการเขียนโปรแกรมเพื่อเช็คว่าเวลาที่ๆผู้ใช้โปรแกรมเราใส่เข้ามา ถูกต้องตามรูปแบบข้างล่างหรือไม่

"ชั่วโมง:นาที:วินาที.เศษวินาที"


ผมก็สามารถทำได้โดยสร้าง RegEx pattern เพื่อเช็คว่าค่าที่ใส่เข้ามา นอกจากนั้นผมยังกำหนด RegEx pattern เพื่อดึงรายละเอียดเช่นชั่วโมง นาที หรือวินาทีได้ทันที
C# สนับสนุน RegEx โดยใช้ System.Text.RegularExpressions และใช้รูปแบบๆเดียวกับ Perl 5 (http://msdn.microsoft.com/en-us/library/az24scfc.aspx) มาดูกันเลยว่าเราจะเขียนโปรแกรมข้างบนโดยใช้ C# ได้อย่างไร (ในตัวอย่างนี้ผมสร้าง C# Console Application)

ก่อนอื่นผมต้องใส่

Code (C#)
using System.Text.RegularExpressions; 


ถ้าไม่ได้ใส่ Visual Studio จะฟ้อง แต่สามารถใช้ ctrl-. เพื่อให้ Visual Studio เติม using ข้างบนให้โดยอัตโนมัติ

ต่อมาผมสร้าง RegEx pattern ซึ่งเป็นแค่ string ธรรมดาที่มีรูปแบบที่เราต้องการ

Code (C#)
var patterns = @"^([1-9]|(0|1)[0-9]|(2)[0-3]):([0-5][0-9]):([0-5][0-9]).([0-9][0-9])\z";



@ ตัวแรกก่อน string นี่ไม่เกี่ยวกับ RegEx แต่เป็นการบอก Visual Studio ว่าไม่ต้องสนใจ escape sequences (string ที่มี backslash นำหน้าเช่น \r\n สำหรับการขึ้นบรรทัดใหม่) ไม่อย่างนั้นเราจะต้องใช้ "\\z"

มาลองดูกันว่าใน RegEx pattern ข้างบนมีอะไรบ้าง

^expression กำกับว่า expression จะต้องเป็นจุดเริ่มของบรรทัด

(subexpression) เพื่อจับกลุ่มของ string ที่เราต้องการ

[first-last] บอกว่า character ที่จะเช็คจะอยู่ในค่าระหว่าง first กับ last ใช้ได้กับตัวเลขหรือตัวอักษร

\z กำกับว่า expression จะต้องอยู่ตำแหน่งท้ายสุดของบรรทัด

regex-dotnet-ex

RegEx pattern ข้างบนนี้เราสามารถนำไปใช้เพื่อในการเช็คว่า input string นั้นตรงตามแบบแผนที่ว่ามานี้หรือเปล่า โดยการเรียก

Code (C#)
public bool IsMatch(string input)
ดังตัวอย่างข้างล่าง

Code (C#)
var patterns = @"^([1-9]|(0|1)[0-9]|(2)[0-3]):([0-5][0-9]):([0-5][0-9]).([0-9][0-9])\z";

Regex rx = new Regex(patterns, RegexOptions.IgnoreCase);
 
Console.WriteLine("IsMatch\r\n=======");
foreach (var haystack in haystacks)
{
     if(rx.IsMatch(haystack))
   {
      Console.WriteLine("{0} matches our pattern.", haystack);
   }                
}


ถ้าเราต้องการให้ RegEx matching ช่วยดึงค่าที่ match ในแต่ละกลุ่ม เราก็สามารถเพิ่มใส่ชื่อลงไปใน RegEx pattern เพื่อที่เราจะได้อ้างถึงกลุ่มนั้นได้อีก

Code (C#)
@"(?<hour>^([1-9]|(0|1)[0-9]|(2)[0-3])):(?<minute>([0-5][0-9])):(?<second>([0-5][0-9])).(?<centisecond>([0-9][0-9])\z)"


จากตัวอย่างข้างบนจะเห็นว่าผมใส่ ?<name> เพื่อให้สามารถดึงค่าที่ match มาใช้ดังตัวอย่างข้างล่าง

Code (C#)
var patternsWithNames = @"(?<hour>^([1-9]|(0|1)[0-9]|(2)[0-3])):(?<minute>([0-5][0-9])):(?<second>([0-5][0-9])).(?<centisecond>([0-9][0-9])\z)";
Regex rx2 = new Regex(patternsWithNames, RegexOptions.IgnoreCase);
foreach (var haystack in haystacks)
{
  MatchCollection matchCollection = rx2.Matches(haystack);
 
  if (matchCollection.Count > 0)
  {
    foreach (Match match in matchCollection)
    {
      Console.WriteLine("{0} matches our pattern.", haystack);
      Console.WriteLine("hour: {0}", Int32.Parse(match.Groups["hour"].ToString()));
      Console.WriteLine("minute: {0}", Int32.Parse(match.Groups["minute"].ToString()));
        Console.WriteLine("second: {0}", Int32.Parse(match.Groups["second"].ToString()));
      Console.WriteLine("centisecond: {0}", Int32.Parse(match.Groups["centisecond"].ToString()));
      Console.WriteLine();
    }
  }
}


จะเห็นได้ว่าแค่กำหนด RegEx pattern เราก็สามารถใช้ความสามารถของ RegEx ในการตรวจสอบหรือดึงค่าที่เราต้องการจาก string ได้

ตัวอย่างที่ผมให้มาอาจจะไม่ซับซ้อนมาก แต่ถ้าใครอยากเรียนรู้ RegEx สำหรับ .NET เพิ่มเติมก็ไปดูได้ที่

http://msdn.microsoft.com/en-us/library/hs600312.aspx

ถ้าอยากจะทดสอบว่า RegEx pattern ถูกต้องหรือไม่ โดยที่ไม่อยากจะลองกับโปรแกรมตัวเอง ก็อาจจะลองใช้ โปรแกรม Silverlight จาก RegExHero, http://regexhero.net/tester/ ได้เหมือนกัน

นอกจากนั้นถ้าไม่อยากเสียเวลาคิด RegEx pattern ขึ้นมาเองก็ลองไปหา patterns ที่มีคนสร้างกันมาแล้วเผยแพร่ให้ใช้กันได้ที่ http://www.regexlib.com/

หวังว่าบทความนี้คงเป็นประโยชน์สำหรับผู้ที่อยากจะลองใช้ Regular Expression ไม่มากก็น้อยนะครับ







   
Share
Bookmark.   

  By : karlkim
  Article : บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ
  Score Rating :
  Create Date : 2011-10-24
  Download : Download  Regular Expression กับ .NET Framework (0.0269 MB)
Sponsored Links
ThaiCreate.Com Forum


Comunity Forum Free Web Script
Jobs Freelance Free Uploads
Free Web Hosting Free Tools

สอน PHP ผ่าน Youtube ฟรี
สอน Android การเขียนโปรแกรม Android
สอน Windows Phone การเขียนโปรแกรม Windows Phone 7 และ 8
สอน iOS การเขียนโปรแกรม iPhone, iPad
สอน Java การเขียนโปรแกรม ภาษา Java
สอน Java GUI การเขียนโปรแกรม ภาษา Java GUI
สอน JSP การเขียนโปรแกรม ภาษา Java
สอน jQuery การเขียนโปรแกรม ภาษา jQuery
สอน .Net การเขียนโปรแกรม ภาษา .Net
Free Tutorial
สอน Google Maps Api
สอน Windows Service
สอน Entity Framework
สอน Android
สอน Java เขียน Java
Java GUI Swing
สอน JSP (Web App)
iOS (iPhone,iPad)
Windows Phone
Windows Azure
Windows Store
Laravel Framework
Yii PHP Framework
สอน jQuery
สอน jQuery กับ Ajax
สอน PHP OOP (Vdo)
Ajax Tutorials
SQL Tutorials
สอน SQL (Part 2)
JavaScript Tutorial
Javascript Tips
VBScript Tutorial
VBScript Validation
Microsoft Access
MySQL Tutorials
-- Stored Procedure
MariaDB Database
SQL Server Tutorial
SQL Server 2005
SQL Server 2008
SQL Server 2012
-- Stored Procedure
Oracle Database
-- Stored Procedure
SVN (Subversion)
แนวทางการทำ SEO
ปรับแต่งเว็บให้โหลดเร็ว


Hit Link
   







Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่