2016-06-24 18 views
5

Tôi đang cố gắng viết một biểu thức chính quy đơn giản để xác định tất cả tên tệp trong danh sách kết thúc bằng đuôi ".req.copied". Mã tôi đang sử dụng được cung cấp bên dướiCụm từ thông dụng cho phần mở rộng tập tin trong Java

public class Regextest { 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
String test1=new String("abcd.req.copied"); 
    if(test1.matches("(req.copied)?")) { 
    System.out.println("Matches"); 
    } 
    else 
    System.out.println("Does not Match"); 
    } 

} 

Kiểm tra regex ok trong kiểm tra regex trực tuyến nhưng không hoạt động trong chương trình. Tôi đã thử nhiều kết hợp (như tách req và sao chép thành hai regexes, hoặc phù hợp với chữ của dấu chấm) nhưng không có gì hoạt động (ngay cả regex đơn giản nhất của (reg)? Trả về một kết quả "Không phù hợp"). Vui lòng cho tôi biết cách giải quyết vấn đề này.

+10

Tại sao không chỉ 'string.endsWith ("req.copied."); '? – resueman

+0

Một số tệp trong thư mục có đuôi mở rộng tùy chỉnh như ".err" sau ".req.copied" (tức là ".req.copied.err"). Nhưng ya endsWith không giải quyết được một nửa vấn đề. Cảm ơn resueman. – MohanVS

+1

Bạn có thể sử dụng 'contains()' – sinclair

Trả lời

5

Vấn đề chính với matches ở đây là yêu cầu từ regex phải khớp với toàn bộ chuỗi. Nhưng trong trường hợp của bạn, regex của bạn chỉ mô tả phần của nó.

Nếu bạn thực sự muốn sử dụng matches đây mã của bạn có thể trông giống như

test1.matches(".*\\.req\\.copied") 
  • . đại diện cho bất kỳ ký tự (trừ tách dòng như \r) vì vậy nếu bạn muốn nó chỉ chiếm chấm bạn cần thoát khỏi nó như \. (trong chuỗi chúng ta cần viết nó là "\\."\ cũng có ý nghĩa đặc biệt ở đó - như tạo các ký tự đặc biệt \r\n\t v.v.).
  • .* sẽ cho phép regex chấp nhận bất kỳ ký tự trước khi .req.copied

Nhưng trong trường hợp của bạn, bạn chỉ đơn giản là nên sử dụng phương pháp endsWith

test1.endsWith(".req.copied") 
+0

Cảm ơn Pshemo! Tôi đã sử dụng một dấu gạch chéo duy nhất trước dấu chấm để biểu thị ký tự chữ, đó là lỗi của tôi. – MohanVS

2

Là người chia sẻ cho biết trong các nhận xét, bạn không cần regex cho điều đó. Bạn có thể chỉ cần kiểm tra xem mỗi tên tệp là endsWith(".req.copied").

if(test1.endsWith(".req.copied")){ 
    System.out.println("Matches"); 
}else{ 
    System.out.println("Does not match"); 
} 

Bằng cách này, nếu có thể được thay thế bằng System.out.println(test1.endsWith(".req.copied") ? "Matches" : "Does not match");.

+0

Cảm ơn bạn dorukayhan! – MohanVS

1

test1.matches(".*\\.req\\.copied") nên làm điều đó nhưng trong trường hợp của bạn, bạn nên xem xét sử dụng endsWith() thay vì matches.

+1

Hãy chắc chắn thoát khỏi '.' như' \\. ' – oldrinb

+0

Cảm ơn sự chân thành! Cảm ơn oldrinb! – MohanVS

1

Bạn nên đưa ra một Regex rằng sẽ phù hợp với các định dạng chuỗi toàn bộ, không phải là một đoạn:

String test1= "abcd.req.copied"; 

if(test1.matches("^.*req\\.copied$")) { 
    System.out.println("Matches"); 
} else { 
    System.out.println("Does not Match"); 
} 

Ngoài ra, định dạng của bạn đã sử dụng (req.copied)?, mà sẽ phù hợp với bất kỳ trường hợp. Ngoài ra, . biểu tượng khớp với bất kỳ ký tự nào, do đó hãy thoát khỏi ký hiệu đó để khớp một dấu chấm.

+0

Cảm ơn bạn Agner! – MohanVS

Các vấn đề liên quan