ไม่สามารถข้ามตัวอักษรภายใน Capture Group ได้ เพราะการจับคู่ (match) ใน Regular Expression จะต้องเป็น ต่อเนื่อง (consecutive) เสมอ แม้จะมี zero-width assertions (เช่น lookahead/lookbehind) ก็ตาม
ตัวอย่างการเข้าถึง Matched Groups (วิธีทางเลือก)
<html>
<head>
<script>
var str = "Username akdg_amit";
var myReg = /(?:^|\s)akdg_(.*?)(?:\s|$)/g;
var res = myReg.exec(str);
document.write(res[1]); // "amit"
</script>
</head>
</body>
</html>
วิธีแก้ปัญหา "อยากข้ามตัวอักษรบางตัว"
1. ใช้ Multiple Capture Groups
// จับแยกส่วนที่ต้องการ "abc123def".match(/([a-z]+)(\d+)([a-z]+)/); // ["abc123def", "abc", "123", "def"]
2. ใช้ Replace กับ Function
// แทนที่ส่วนที่ไม่ต้องการ "prefix_123_suffix".replace(/prefix_(\d+)_suffix/, "$1"); // "123"
3. ใช้ Lookaround Assertions (ES2018+)
// Positive Lookbehind - จับเฉพาะหลัง "prefix_" "prefix_123".match(/(?<=prefix_)\d+/); // ["123"] // Positive Lookahead - จับเฉพาะก่อน "_suffix" "123_suffix".match(/\d+(?=_suffix)/); // ["123"]
4. ใช้ Named Capture Groups (ES2018)
const regex = /(?prefix_)?(? \d+)(? _suffix)?/; const match = regex.exec("prefix_123_suffix"); console.log(match.groups.number); // "123" (เข้าถึงโดยชื่อ)
สรุป: Capture Group จับได้เฉพาะตัวอักษรติดต่อกัน หากต้องการแยกส่วน ให้ใช้ Multiple Groups, Lookaround, หรือ Named Groups แทน