Metacharacter \E จบ quoting ที่เริ่มด้วย \Q ทุกตัวอักษรระหว่าง \Q และ \E จะถูกถือเป็น literal characters (metacharacters สูญเสียความหมายพิเศษ)
ตัวอย่าง 1: โดยไม่ใช้ \Q...\E
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SampleProgram {
public static void main(String args[]) {
String regex = "[aeiou]";
Scanner sc = new Scanner(System.in);
System.out.println("Enter input string: ");
String input = sc.nextLine();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
System.out.println("Match occurred");
} else {
System.out.println("Match not occurred");
}
}
}
ผลลัพธ์
Enter input string: sample
Match occurred
ตัวอย่าง 2: ใช้ \Q...\E
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SampleProgram {
public static void main(String args[]) {
String regex = "\\Q[aeiou]\\E";
Scanner sc = new Scanner(System.in);
System.out.println("Enter input string: ");
String input = sc.nextLine();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
System.out.println("Match occurred");
} else {
System.out.println("Match not occurred");
}
}
}
ผลลัพธ์
Enter input string: sample
Match not occurred
Enter input string: The letters [aeiou] are vowels in English alphabet
Match occurred
อธิบาย
[aeiou]= character class จับคู่สระ a, e, i, o, u\Q[aeiou]\E= จับคู่สตริง literal "[aeiou]" ทุกตัวอักษร- ใน Java string literal:
"\\Q[aeiou]\\E"(escape backslash) - ใน regex จริง:
\Q[aeiou]\E
การใช้งาน
- ค้นหาสตริงที่มี metacharacters:
\Q.*+?^${}()|[]\\\E - สร้าง regex จาก user input อย่างปลอดภัย:
Pattern.compile("\\Q" + userInput + "\\E") Pattern.quote(String)ทำอย่างเดียวกันอัตโนมัติ (แนะนำ)
ตัวอย่าง Pattern.quote()
String userInput = "[aeiou]";
String regex = Pattern.quote(userInput); // คืนค่า \Q[aeiou]\E
Pattern pattern = Pattern.compile(regex);
matcher = pattern.matcher("The letters [aeiou] are vowels");
// Match occurred
ข้อควรระวัง
\Eต้องมี\Qนำหน้า มิฉะนั้นจะ error- ไม่สามารถ nest \Q...\E ได้
- หาก user input มี
\Eเอง จะจบ quoting ก่อนเวลา → ใช้ Pattern.quote() ปลอดภัยกว่า