<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jQuery, Ajax, PHP, JSON, XML, Web Technologies &#187; Regular Expression</title>
	<atom:link href="http://blog.chonla.com/category/regular-expression/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chonla.com</link>
	<description>คุยกันเรื่อง jQuery, Ajax, PHP, JSON, XML และ Web Technologies เป็นภาษาไทยกันดีกว่า</description>
	<lastBuildDate>Wed, 08 Sep 2010 19:28:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Regular Expression : ไม่เริ่มต้นด้วย&#8230; เขียนยังไงเนี่ย</title>
		<link>http://blog.chonla.com/2010/06/regular-expression-%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%80%e0%b8%a3%e0%b8%b4%e0%b9%88%e0%b8%a1%e0%b8%95%e0%b9%89%e0%b8%99%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2/</link>
		<comments>http://blog.chonla.com/2010/06/regular-expression-%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%80%e0%b8%a3%e0%b8%b4%e0%b9%88%e0%b8%a1%e0%b8%95%e0%b9%89%e0%b8%99%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 21:13:05 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Regular Expression]]></category>
		<category><![CDATA[Negative Look Ahead]]></category>
		<category><![CDATA[Negative Look Behind]]></category>
		<category><![CDATA[Positive Look Ahead]]></category>
		<category><![CDATA[Positive Look Behind]]></category>
		<category><![CDATA[Zero-Width Assertion]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=290</guid>
		<description><![CDATA[ใน Regular Expression วิธีการเขียน pattern ให้ตรวจสอบว่า จะต้องขึ้นต้นด้วยตัวเลขเท่านั้น หรือจะต้องขึ้นต้นด้วยตัวอักษรภาษาอังกฤษเท่านั้น ทำได้ง่าย ๆ โดยการเติมสัญลักษณ์ ^ เข้าไปด้านหน้า ทีนี้ เราอยากเปลี่ยน pattern ให้ตรวจสอบเป็น ห้ามขึ้นด้วยตัวเลขนะ หรือห้ามขึ้นด้วยตัวอักษรภาษาอังกฤษนะ จะทำยังไงดีล่ะ&#8230; มาดูกัน วิธีง่าย ๆ ที่มานำเสนอก็คือ การใช้สิ่งที่เรียกว่า Zero-width negative look ahead assertion ครับ แค่ชื่อก็ปวดหัวตึ้บ&#8230; เดี๋ยวก่อนครับ วิธีการใช้งานมันง่ายกว่าชื่อของมันครับ เพียงแค่เราใส่ ^(?! และ ) ครอบสิ่งที่เราไม่ต้องการให้ขึ้นต้น เท่านั้นเป็นอันจบครับ ยกตัวอย่างเช่น เราไม่ต้องการให้ขึ้นต้นด้วย abc แต่หลังจากนั้นจะเป็นอะไรก็ได้ เราก็ใช้ pattern เป็น ^(?!abc)\w+ ครับ ทีนี้ คำที่ขึ้นต้นด้วย abc ทั้งหมด จะ fail [...]]]></description>
			<content:encoded><![CDATA[<p>ใน Regular Expression วิธีการเขียน pattern ให้ตรวจสอบว่า จะต้องขึ้นต้นด้วยตัวเลขเท่านั้น หรือจะต้องขึ้นต้นด้วยตัวอักษรภาษาอังกฤษเท่านั้น ทำได้ง่าย ๆ โดยการเติมสัญลักษณ์ ^ เข้าไปด้านหน้า ทีนี้ เราอยากเปลี่ยน pattern ให้ตรวจสอบเป็น ห้ามขึ้นด้วยตัวเลขนะ หรือห้ามขึ้นด้วยตัวอักษรภาษาอังกฤษนะ จะทำยังไงดีล่ะ&#8230;</p>
<p>มาดูกัน <img src='http://blog.chonla.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-290"></span>วิธีง่าย ๆ ที่มานำเสนอก็คือ การใช้สิ่งที่เรียกว่า Zero-width negative look ahead assertion ครับ แค่ชื่อก็ปวดหัวตึ้บ&#8230; เดี๋ยวก่อนครับ วิธีการใช้งานมันง่ายกว่าชื่อของมันครับ เพียงแค่เราใส่ ^(?! และ ) ครอบสิ่งที่เราไม่ต้องการให้ขึ้นต้น เท่านั้นเป็นอันจบครับ</p>
<p>ยกตัวอย่างเช่น เราไม่ต้องการให้ขึ้นต้นด้วย abc แต่หลังจากนั้นจะเป็นอะไรก็ได้ เราก็ใช้ pattern เป็น ^(?!abc)\w+ ครับ ทีนี้ คำที่ขึ้นต้นด้วย abc ทั้งหมด จะ fail ในการ match กับ pattern ครับ</p>
<p>ไอ้เจ้า Zero-width negative look ahead assertion จริง ๆ แล้วมันมีอะไรมากกว่านั้นครับ อธิบายต่ออีกหน่อยละกัน สาเหตุที่เราเรียกว่า Zero-width assertion เพราะเราไม่นับว่ามันเป็นตัวอักษร และมันจะทำหน้าที่สำหรับตรวจดูว่าจะเอาไป match ได้หรือเปล่าเท่านั้น โดยไม่เอาค่าในวงเล็บไปใส่ในผลการ match</p>
<p>นอกเหนือจาก negative look ahead แล้ว มันยังมีรูปแบบอื่น ๆ ที่เกี่ยวข้องด้วย รวมแล้วมี 4 แบบ คือ positive look ahead, negative look ahead, positive look behind และ negative look behind&#8230; มาดูกันทีละตัวเลยครับ</p>
<p><strong>Positive Look Ahead</strong> จะใช้สำหรับการ match ที่ตามหลังกัน เขียนอยู่ในรูปแบบ q(?=u) หมายถึง จะ match กับ q ที่ตามด้วย u เท่านั้น (เราจะสังเกตได้ว่า q จะถูกนำไปใส่ในผลการ match แต่ u ไม่ถูกนำไปรวม เพราะว่ามันเป็น zero-width assertion ไงครับ)</p>
<p><strong>Negative Look Ahead</strong> อันนี้พูดถึงไปแล้วตั้งแต่แรก ใช้สำหรับการ match สิ่งที่ไม่ตามกัน เขียนในรูปแบบ q(?!u) หมายถึงว่า จะ match กับ q ที่ไม่ได้ตามด้วย u (จากตัวอย่างแรกของเรา เขียนเริ่มต้นว่า ^(?!abc) นั่นคือ เริ่มต้นประโยค หรือ ^ ที่ไม่ตามด้วย abc หรือ (?!abc) นั่นเอง)</p>
<p><strong>Positive Look Behind</strong> จะคล้าย ๆ กับ Positive Look Ahead ครับ แต่ทำจากด้านหลังมา เขียนอยู่ในรูปแบบ (?&lt;=a)b จะหมายถึงว่า จะ match กับ b ที่ตามหลัง a อยู่</p>
<p><strong>Negative Look Behind</strong> ก็ในทำนองเดียวกันกับ Negative Look Ahead เลยครับ ทำจากด้านหลังมา เขียนอยู่ในรูปแบบ (?&lt;!a)b จะหมายถึงว่า จะ match กับ b ที่ไม่ได้นำหน้าด้วย a</p>
<p>ดังนั้น มาถึงตรงนี้แล้ว ถ้าเราอยากเขียน pattern ให้ match กับข้อความที่ไม่ได้ลงท้ายด้วยคำว่า end ล่ะ จะต้องเขียนยังไง&#8230;</p>
<p>เฉลย \w+(?&lt;!end)$ ไงครับ (\w = ตัวอักษรใด ๆ ตามด้วย Negative Look Behind และปิดท้ายด้วย $ คือ สิ้นสุดประโยค)</p>
<p>สนุกมั๊ยครับ <img src='http://blog.chonla.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2010/06/regular-expression-%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%80%e0%b8%a3%e0%b8%b4%e0%b9%88%e0%b8%a1%e0%b8%95%e0%b9%89%e0%b8%99%e0%b8%94%e0%b9%89%e0%b8%a7%e0%b8%a2-%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>รู้จักกับ Regular Expression กันเถอะ</title>
		<link>http://blog.chonla.com/2009/12/%e0%b8%a3%e0%b8%b9%e0%b9%89%e0%b8%88%e0%b8%b1%e0%b8%81%e0%b8%81%e0%b8%b1%e0%b8%9a-regular-expression-%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%80%e0%b8%96%e0%b8%ad%e0%b8%b0/</link>
		<comments>http://blog.chonla.com/2009/12/%e0%b8%a3%e0%b8%b9%e0%b9%89%e0%b8%88%e0%b8%b1%e0%b8%81%e0%b8%81%e0%b8%b1%e0%b8%9a-regular-expression-%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%80%e0%b8%96%e0%b8%ad%e0%b8%b0/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 18:06:20 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Regular Expression]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=255</guid>
		<description><![CDATA[Regular Expression คืออะไร Regular Expression (หรือ regex) คือ string pattern ที่ใช้แสดงรูปแบบของคำ หรือข้อความใด ๆ โดยตัว regex เองนั้นมีพื้นฐานมาจากทฤษฏีทางคณิตศาสตร์เพื่อใช้ในการเปรียบเทียบข้อความนั้น ๆ กับ pattern ที่กำหนดว่าสอดคล้องกันหรือไม่ (match) Regular Expression Engine Programming lanugage ปัจจุบันจะสนับสนุนการใช้งาน regex แล้ว แต่ปัญหาหนึ่งคือการเข้ากันได้ของ regex ในแต่ละภาษา ไม่ว่าจะเป็นความสามารถ และวิธีการเขียนที่แตกต่างกัน ดังนั้น regex ในภาษาหนึ่งจะไม่สามารถนำไปใช้กับอีกภาษาหนึ่งได้ทั้งหมด จะต้องมีการแก้ไขบางส่วนเพื่อให้สอดคล้องกับ engine ในภาษานั้น ๆ เราจะใช้ Regular Expression ตอนไหน ลองนึกถึงสถานการณ์ที่เรามีข้อความขนาดเป็นแสน ๆ ตัวอักษร และเราต้องการดูว่ามีคำซักคำในข้อความนั้นหรือไม่ บางคนอาจจะนึกถึงการใช้ strpos() แต่ลองนึกต่อไปอีกนิดว่า ถ้าคำที่เราต้องการหามันซับซ้อนกว่าที่เราจะทำแบบนั้นได้ล่ะ เช่น เราต้องการหาว่ามีคำที่ขึ้นต้นด้วย [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Regular Expression คืออะไร</strong></p>
<p>Regular Expression (หรือ regex) คือ string pattern ที่ใช้แสดงรูปแบบของคำ หรือข้อความใด ๆ โดยตัว regex เองนั้นมีพื้นฐานมาจากทฤษฏีทางคณิตศาสตร์เพื่อใช้ในการเปรียบเทียบข้อความนั้น ๆ กับ pattern ที่กำหนดว่าสอดคล้องกันหรือไม่ (match)</p>
<p><strong>Regular Expression Engine</strong></p>
<p>Programming lanugage ปัจจุบันจะสนับสนุนการใช้งาน regex แล้ว แต่ปัญหาหนึ่งคือการเข้ากันได้ของ regex ในแต่ละภาษา ไม่ว่าจะเป็นความสามารถ และวิธีการเขียนที่แตกต่างกัน ดังนั้น regex ในภาษาหนึ่งจะไม่สามารถนำไปใช้กับอีกภาษาหนึ่งได้ทั้งหมด จะต้องมีการแก้ไขบางส่วนเพื่อให้สอดคล้องกับ engine ในภาษานั้น ๆ</p>
<p><span id="more-255"></span></p>
<p><strong>เราจะใช้ Regular Expression ตอนไหน</strong></p>
<p>ลองนึกถึงสถานการณ์ที่เรามีข้อความขนาดเป็นแสน ๆ ตัวอักษร และเราต้องการดูว่ามีคำซักคำในข้อความนั้นหรือไม่ บางคนอาจจะนึกถึงการใช้ strpos() แต่ลองนึกต่อไปอีกนิดว่า ถ้าคำที่เราต้องการหามันซับซ้อนกว่าที่เราจะทำแบบนั้นได้ล่ะ เช่น เราต้องการหาว่ามีคำที่ขึ้นต้นด้วย c และลงท้ายด้วย e หรือไม่ กว่าเราจะทำ strpos เช็คดูทีละคำเสร็จคงจะหมดแรงพอดี ลองพิจารณาถึง regex ต่อไปนี้ \bc\w+e\b ที่สามารถหาคำที่ต้องการได้โดยคำสั่งเดียวดูว่าชีวิตจะง่ายขึ้นขนาดไหน</p>
<p><strong>Regular Expression ใน PHP</strong></p>
<p>ใน PHP นั้น เราสามารถเขียน regex ได้ 2 รูปแบบ คือ POSIX และ PCRE (Perl-Compatible) โดยส่วนตัวผมแล้ว ผมนิยมเขียนแบบ PCRE มากกว่าครับ ในส่วนของ POSIX Regex นั้น คำสั่งจะขึ้นต้นด้วย ereg_ ส่วน PCRE คำสั่งจะขึ้นต้นด้วย preg_ ครับ รูปแบบการเขียนของทั้งสองแบบจะแตกต่างกันเล็กน้อย แต่เมื่อเราเลือกที่จะเขียนแบบไหนแล้ว ก็แนะนำให้เขียนไปแบบเดียวให้ชำนาญครับ ไม่งั้นเดี๋ยวจะตีกันยุ่ง</p>
<p><strong>Regular Expression ใน Javascript</strong></p>
<p>ใน javascript ก็สามารถเขียนได้ 2 รูปแบบเช่นกัน คือ ผ่าน RegExp Object หรือ ผ่าน literal syntax เช่น /pattern/ (ไม่ต้องมีเครื่องหมายคำพูดครอบ เพราะไม่ใช่ String) ส่วนตัวแล้วผมจะนิยมเขียนแบบหลังมากกว่าครับ</p>
<p><strong>สิ่งที่จำเป็นต้องรู้ก่อนเขียน Regular Expression</strong></p>
<p><span style="text-decoration: underline;">Pattern Modifiers</span> นั่นคือ option ต่าง ๆ ที่ใช้ปรับรูปแบบการค้นหาจาก pattern ที่กำหนด เช่น ใน PCRE ถ้าเราระบุ i ไว้หลัง pattern จะเป็นการเปรียบเทียบแบบไม่สนใจตัวเล็กหรือตัวใหญ่ หรือการใส่ s ไว้หลัง pattern จะหมายถึงการกำหนดให้ wild card character (.) รวมเอาอักษรขึ้นบรรทัดใหม่ไว้ด้วย (ดู modifers อื่น ๆ เพิ่มได้ที่ <a title="PCRE Regular Expression Pattern Modifier" href="http://php.net/manual/en/reference.pcre.pattern.modifiers.php" target="_blank">http://php.net/manual/en/reference.pcre.pattern.modifiers.php</a>)</p>
<p><span style="text-decoration: underline;">Pattern Syntax</span> นั่นคือวิธีการเขียน regex นั่นเอง ในส่วนนี้จะรวมถึง meta-character เช่น ^ เป็นการระบุถึงต้นประโยค หรือ $ เป็นการระบุถึงท้ายประโยค หรือ . ที่จะหมายถึงตัวอักษรอะไรก็ได้ยกเว้นขึ้นบรรทัดใหม่ นอกจาก meta-character แล้ว ยังมีชุดของ character ที่ขึ้นต้นด้วย backslash อีกด้วย เช่น \d คือตัวเลข \D คืออักขระที่ไม่ใช่ตัวเลข \w คืออักขระที่นำมาใช้เป็นส่วนหนึ่งของคำได้ \W คือ อักขระที่ไม่ได้เป็นส่วนหนึ่งของคำ เป็นต้น รวมไปถึงการค้นหาตัวอักษรซ้ำ ๆ การทำ Back references การค้นหาแบบ optional ฯลฯ</p>
<p><strong>Back References</strong></p>
<p>ใช้สำหรับอ้างถึง subpattern ใน pattern ที่ระบุ back references ใน PHP จะขึ้นต้นด้วย backslash แล้วตามด้วยตัวเลขที่มากกว่า 0 ในขณะที่ของ javascript จะขึ้นต้นด้วย $ แล้วตามด้วยตัวเลขที่มากกว่า 0 โดย back references จะอ้างถึง subpattern เรียงตามลำดับจากตัวที่พบตัวแรก ให้เป็น 1 ตัวที่สอง ให้เป็น 2 ไปเรื่อย ๆ เช่น เรามี pattern คือ (cat) and (dog) เมื่อเรา match ได้ เราจะได้ \1 เป็น cat และ \2 เป็น dog นั่นเอง</p>
<p><strong>ตัวอย่าง Regular Expression</strong></p>
<p>ดูใน <a title="LIVE DEMO : Regular Expression" href="http://sandbox.chonla.com/regex" target="_blank">LIVE DEMO</a> ได้เลยครับ (Javascript Regular Expression DEMO)</p>
<p><span style="text-decoration: underline;">อ้างอิง</span></p>
<ul>
<li><a href="http://www.regular-expressions.info/tutorial.html" target="_blank">http://www.regular-expressions.info/tutorial.html</a></li>
<li><a href="http://www.websiterepairguy.com/articles/re/12_re.html" target="_blank">http://www.websiterepairguy.com/articles/re/12_re.html</a></li>
<li><a href="http://www.javascriptkit.com/javatutors/re.shtml" target="_blank">http://www.javascriptkit.com/javatutors/re.shtml</a></li>
<li><a href="http://php.net/manual/en/reference.pcre.pattern.modifiers.php" target="_blank">http://php.net/manual/en/reference.pcre.pattern.modifiers.php</a></li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/12/%e0%b8%a3%e0%b8%b9%e0%b9%89%e0%b8%88%e0%b8%b1%e0%b8%81%e0%b8%81%e0%b8%b1%e0%b8%9a-regular-expression-%e0%b8%81%e0%b8%b1%e0%b8%99%e0%b9%80%e0%b8%96%e0%b8%ad%e0%b8%b0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
