Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

ข้ามตัวอักษรใน Capture Group ได้ไหมใน JavaScript Regexp

ไม่สามารถข้ามตัวอักษรภายใน 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 แทน