การแยกวิเคราะห์ String และดึงข้อมูลที่ต้องการออกมาเป็นทักษะสำคัญที่นักทดสอบ (Tester) ควรมี โดยเฉพาะเมื่อทดสอบ API และต้องแยกข้อมูลจาก JSON หรือ XML response ในบทความนี้เราจะมาดูวิธีแยกตัวเลขหรือตัวเลขหลายหลักจาก String ด้วย Java Regex กันครับ
แยกตัวเลขทั้งหมดจาก String
ใช้ Pattern \\d+ เพื่อจับกลุ่มตัวเลขติดกัน
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("string1234more567string890");
while (m.find()) {
System.out.println(m.group());
}
}
}
ผลลัพธ์:
1234
567
890
แยกตัวเลขลำดับที่ N จาก String
ถ้าต้องการแค่กลุ่มตัวเลขลำดับที่ 2 (เช่น 567 จาก string1234more567string890) ให้ใช้ Capturing Group
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
private static final Pattern p = Pattern.compile("[^\\d]*[\\d]+[^\\d]+([\\d]+)");
public static void main(String[] args) {
Matcher m = p.matcher("string1234more567string890");
if (m.find()) {
System.out.println(m.group(1)); // แสดงแค่กลุ่มที่ 1 (ตัวเลขลำดับที่ 2)
}
}
}
ผลลัพธ์: 567
คำอธิบาย Pattern [^\\d]*[\\d]+[^\\d]+([\\d]+)
[^\\d]*- ข้ามตัวอักษรที่ไม่ใช่ตัวเลข[\\d]+- ข้ามกลุ่มตัวเลขแรก[^\\d]+- ข้ามตัวอักษรที่ไม่ใช่ตัวเลขอีกครั้ง([\\d]+)- จับ (capture) กลุ่มตัวเลขที่สอง
แยกตัวเลขจาก Tag Attribute (XML/HTML)
ตัวอย่าง: <result name="response" numFound="9999" start="0"> ต้องการดึงค่า 9999
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[] args) {
String xml = "<result name=\"response\" numFound=\"9999\" start=\"0\">";
Pattern pattern = Pattern.compile("numFound=\"([0-9]+)\"");
Matcher matcher = pattern.matcher(xml);
if (matcher.find()) {
System.out.println(matcher.group(1)); // 9999
}
}
}
แยก String ที่ประกอบด้วยตัวเลขและตัวอักษร
ตัวอย่าง: YOUR SET ADDRESS IS 6B1BC0 TEXT ต้องการดึง 6B1BC0 (6 ตัวอักษร)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[] args) {
Pattern p = Pattern.compile("YOUR SET ADDRESS IS\\s+([A-Z0-9]{6})");
Matcher n = p.matcher("YOUR SET ADDRESS IS 6B1BC0 TEXT");
if (n.find()) {
System.out.println(n.group(1)); // 6B1BC0
}
}
}
แยก Key-Value Pair ด้วย Regular Expressions
String: bookname=testing&bookid=123456&bookprice=123.45 ต้องการ bookid=123456
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[] args) {
String s = "bookname=cooking&bookid=123456&bookprice=123.45";
// ใช้ Positive Lookbehind
Pattern p = Pattern.compile("(?<=bookid=)\\d+");
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group()); // 123456
}
}
}