ใช้ capturing groups แยกตัวเลขและตัวอักษร แล้วแทนที่ด้วย $1 $2 (group 1 + space + group 2)
วิธีที่ 1: จับคู่ digit ตามด้วย letter
import java.util.Scanner;
public class SampleTest {
public static void main(String args[]) {
String regex = "(\\d)([A-Za-z])";
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String result = input.replaceAll("(\\d)([A-Za-z])", "$1 $2");
System.out.println(result);
}
}
ผลลัพธ์
Enter input text: 21This 23is 56sample 99text
21 This 23 is 56 sample 99 text
วิธีที่ 2: Lookaround (รองรับ 2 ทิศทาง)
เพิ่ม space ระหว่างตัวเลขและตัวอักษร ไม่ว่าจะเป็นตัวเลขหน้าตัวอักษร หรือตัวอักษรหน้าตัวเลข:
import java.util.Scanner;
public class SampleTest {
public static void main(String args[]) {
// (?<=[A-Za-z])(?=[0-9]) | (?<=[0-9])(?=[A-Za-z])
// หลังตัวอักษรหน้าตัวเลข | หลังตัวเลขหน้าตัวอักษร
String regex = "(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])";
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String result = input.replaceAll(regex, " ");
System.out.println(result);
}
}
ผลลัพธ์
Enter input text: 21This23is56sample99text
21 This 23 is 56 sample 99 text
อธิบาย Lookaround
| Pattern | ชื่อ | ความหมาย | |
|---|---|---|---|
(?<=X) | Positive Lookbehind | ต้องมี X ก่อนหน้า (ไม่ consume) | |
(?<!X) | Negative Lookbehind | ต้องไม่มี X ก่อนหน้า | |
(?=X) | Positive Lookahead | ต้องมี X ถัดไป (ไม่ consume) | |
(?!X) | Negative Lookahead | ต้องไม่มี X ถัดไป |
| วิธี | Regex | รองรับ | หมายเหตุ |
|---|---|---|---|
| Capturing groups | (\\d)([A-Za-z]) | digit → letter | Consume ตัวอักษร ต้องใช้ $1 $2 |
| Lookaround | (?<=\\d)(?=[A-Za-z])|... | ทั้ง 2 ทิศทาง | Zero-width ไม่ consume ใช้ replaceAll(" ") |
ข้อจำกัด Lookbehind ใน Java
- Java 8: lookbehind ต้องเป็น fixed-length (ไม่รองรับ
*,+ภายใน) - Java 9+: รองรับ limited variable-length lookbehind
(?<=[A-Za-z])OK (fixed 1 char)(?<=\\d+)Error ใน Java 8