Có phương pháp nào trong Java hoặc bất kỳ thư viện nguồn mở nào để thoát (không trích dẫn) một ký tự đặc biệt (ký tự meta), để sử dụng nó như một biểu thức chính quy không?Thoát các ký tự đặc biệt trong Java Biểu thức chính quy
Điều này sẽ rất tiện dụng trong việc tạo động một biểu thức chính quy, mà không phải tự thoát từng ký tự riêng lẻ.
Ví dụ, hãy xem xét một regex đơn giản như \d+\.\d+
phù hợp với con số với một dấu thập phân như 1.2
, cũng như đoạn mã sau:
String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");
Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);
System.out.println("Regex 1: " + regex1);
if (numbers1.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
System.out.println("Regex 2: " + regex2);
if (numbers2.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
Không ngạc nhiên, sản lượng sản xuất bởi các mã trên là:
Regex 1: \d+\.\d+
Match
Regex 2: \Qd+.d+\E
No match
đó là, regex1
trận 1.2
nhưng regex2
(đó là "động" xây dựng) không (thay vào đó, nó phù hợp với chuỗi chữ d+.d+
).
Vì vậy, có phương pháp tự động thoát từng ký tự meta regex không?
Nếu có, chúng ta hãy nói, một escape()
phương pháp tĩnh trong java.util.regex.Pattern
, đầu ra của
Pattern.escape('.')
sẽ là chuỗi "\."
, nhưng
Pattern.escape(',')
nên chỉ sản xuất ","
, vì nó là không phải là ký tự meta. Tương tự như vậy,
Pattern.escape('d')
có thể sản xuất "\d"
, vì 'd'
được sử dụng để biểu thị chữ số (mặc dù thoát có thể không có ý nghĩa trong trường hợp này, như 'd'
có thể có nghĩa đen 'd'
, trong đó sẽ không bị hiểu lầm bởi interpeter regex để được cái gì khác, như trường hợp với '.'
).
Làm thế nào sẽ như một phương pháp xác định sự khác biệt beween a 'd' nghĩa như ký tự meta và 'd' trong văn bản để khớp? ('quote (" d + Dollars? ")' sẽ trở thành '" \\ d + \\ Dollar \\ s? "' trong một phương pháp trích dẫn tầm thường.) – rsp
Đúng, đó là lý do tại sao tôi yêu cầu một phương pháp để thoát nhân vật cá nhân! :-) – PNS
Để chỉ thoát các ký tự riêng lẻ bạn có thể chơi xung quanh với một đường ranh giới từ, giống như: 's/\ b ([dswDSW]) \ b/\\ $ 1/g; ' – rsp