|
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 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 ไม่มากก็น้อยนะครับ
|
|
|
|
|
|
|
|
By : |
karlkim
|
|
Article : |
บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ |
|
Score Rating : |
|
|
Create Date : |
2011-10-24 |
|
Download : |
(0.0269 MB) |
|
Sponsored Links |
|
|
|
|
|
|