Posts Tagged ‘ Regular Expressions

ประสิทธิภาพ regular expression

จากเรื่อง Count number of charactor in String ก่อนหน้านี้ พอดีมีงานลักษณะเดียวกัน แต่เป็นการอ่านข้อมูลจาก text file ที่มีขนาดประมาณ 1MB และมีข้อมูลตัวอักษรประมาณ 1,017,825 ตัว ผลการทดลองอย่างคร่าวๆได้ผลว่าการเขียน code แบบวน loop ตัดอักษรทีละตัวมาตรวจสอบนั้นทำงานได้ไวกว่าแบบใช้ regular expression ตัวอย่าง code การทดสอบ เผื่อใครจะเห็นว่า
เขียนได้ห่วยเอง มันเลยไม่ได้ประสิทธิภาพ ผลการทดสอบดังนี้
แบบธรรมดา

private static void test1(String data) {
	int found = 0;
	long start = System.currentTimeMillis();
	for (int i = 0; i < data.length(); i++) {
		found += ('M' == data.charAt(i)) ? 1 : 0;
	}
	long end = System.currentTimeMillis();
	System.out.println("Data : " + data.length());
	System.out.println("Found : " + found);
	System.out.println("Start : " + start);
	System.out.println("End : " + end);
	System.out.println("Diff : " + (end - start));
}

ผลการรัน

Data : 1017825
Found : 42880
Start : 1266287262406
End : 1266287262421
Diff : 15

Read more

ปัญหาการใช้ split method ใน String

หลังจากที่เคยเขียน ปัญหา การใช้ split method กับ ทศนิยม (.) มาแล้วจาก การ split จุดทศนิยมใน Java วันนี้เจอปัญหาอีกประเด็นก็คือ กรณีที่ข้อมูลหลังเครื่องหมายที่จะทำการ split นั้นเป็นค่าว่าง ทำให้ split method ทำงานไม่ถูกต้อง ตัวอย่างเช่น
มีข้อมูลดังนี้

"A|B|C|||"

Code ตัวอย่างในการตัดข้อความด้วย split method จะใช้ดังนี้

/**
 * File Name : TestSplit.java
 * Created Date : Feb 11, 2010 : 11:07:09 AM
 * Copyright © 2010 www.fun4station.com
 */
package com.fun4station.test;

/**
 * @Author Supot Saelao 
 * @Version 1.0
 */
public class TestSplit {
	public static void main(String[] args) {
		String data = "A|B|C|||";	
		String[] datas = data.split("\\|");
		System.out.println("size of data : " + datas.length);
		print(datas);
	}
	
	private static void print(String[] datas){
		System.out.println("value of data ");
		for(String str : datas){
			System.out.println(str);
		}
	}
}

แทนที่ output ที่จะได้ควรจะเป็น

size of data : 6

แต่ดันออกมาเป็น

size of data : 3

หลังจากขอความช่วยเหลือจากอาจารย์ google ก็ได้คำตอบ และแก้ไขโดยเพิ่ม -1 เข้าไปใน method split ดังนี้

String[] datas = data.split("\\|", -1);

จากการทดลองสามารถแก้ปัญหาได้

ข้อมูลอ้างอิ่ง
http://www.rgagnon.com/javadetails/java-0438.html
sun String.split

Count number of charactor in String

จากโจทย์การเขียนโปรแกรมแก้ปัญหา ปัญหาเขียนโปรแกรมตอนเจ็ด, นับสระในประโยคภาษาอังกฤษ ทำให้ผมลองเขียนโปรแกรมเพื่อตรวจสอบตามโจทย์ ซึ่งก็ได้ตามนี้ ส่วนภาษาอื่นๆนั้นสนใจภาษาใด ก็ตามไปดูตาม link ได้เลยครับ

/**
 * File Name : CountCharInStr.java
 * Created Date : Jan 11, 2010 : 1:26:41 PM
 * Copyright © 2010 www.fun4station.com
 */
package com.fun4station.example;

/**
 * @Author Supot Saelao 
 * @Version 1.0
 */
public class CountCharInStr {
	public static void main(String[] args) {
		String str = "This is a example text we want to count.";
		int found = 0;
		
		// 1. Commond solution
		for (int i = 0; i < str.length(); i++) {
			char tmp = str.charAt(i);
			if('a' == tmp || 'e' == tmp || 'i' == tmp 
					|| 'o' == tmp || 'u' == tmp){
				found++;
			}								
		}
		System.out.println("1. found : "+found);
		
		// 2. Use regular expression
		found = str.replaceAll("[^aeiou]","").length();
		System.out.println("2. found : "+found);		
	}
}

หากเอาทั้งตัวเล็กตัวใหญ่ก็ เพิ่มการตรวจสอบเข้าไป ทั้งในส่วนแบบที่หนึ่ง และ แบบที่สอง
อ้างอิง
http://www.regular-expressions.info/captureall.html

การ trim ด้วย JavaScript

เป็น Code ที่ผมใช้บ่อยๆ แต่ไม่รู้ว่าถูกต้องแน่นอน หรือไม่ รูปก็คือ ใช้ Regular Expression มาช่วยครับ

function trim(str){  
	return str.replace(/^\s*|\s*$/g,"");  
}  

อย่างที่กล่าวไว้แต่แรกครับ ไม่รู้ว่าถูกต้องแค่ไหนแต่ผมก็ใช้งานกับ Application ที่พัฒนามาหลายตัวแล้วครับยังไม่เจอปัญหา

ปัญหา Function replace ใน JavaScript

เวลาผมใช้ Function replace ของ JavaScript แล้วมักจะติดปัญหาในกรณีที่มีตัวอักษรที่ต้องการแทนที่มากกว่า หนึ่ง ตัวอย่างเช่น การลบเครื่องหมาย (,) ออกจากจำนวณเงิน 1,000,000 เวลาใช้ replace แล้วเครื่องหมาย (,) จะออกแค่ตัวเดียว ซึ่งไม่ถูกต้อง จากการไปอ่าน  Regular Expression และทดลองนำมาใช้ดูก็ได้ Solution ดังนี้ครับ

function clearMoneyComma(str) {
	return str.replace(/,/g,"");
}

เป็นการแทนที่ เครื่องหมาย “,” ด้วย ช่องว่าง และแทนที่ทุกตัวที่พบใน string ที่นำมาตรวจสอบ