2013-02-19 39 views
5

Tôi là người mới sử dụng Java. Tôi muốn tìm kiếm một chuỗi trong tập tin văn bản. Giả sử tệp chứa:Làm thế nào để tìm từ có dấu chấm bằng regex trong Java?

Xin chào, tôi đang học Java.

Tôi đang sử dụng mẫu bên dưới này để tìm kiếm qua từng từ chính xác.

Pattern p = Pattern.compile("\\b"+search string+"\\b", Pattern.CASE_INSENSITIVE); 

Nó hoạt động tốt nhưng không tìm thấy "java". Cách tìm cả hai mẫu. tức là có ký hiệu đường biên và có dấu "." ở cuối chuỗi. Có ai có bất kỳ ý tưởng về cách tôi có thể giải quyết vấn đề này?

+0

Vì vậy, bạn có nói rằng nếu Chuỗi tìm kiếm của bạn là "Java", bạn muốn tìm kiếm "Java"? Một số giải thích rõ hơn sẽ giúp chúng tôi giải quyết vấn đề của bạn. – Default

+0

Tôi đã chuyển nhận xét của mình thành câu trả lời. –

+0

Nếu bạn đang tìm kiếm một chuỗi chữ thì chỉ cần sử dụng ['String # indexOf (String)'] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html# indexOf (java.lang.String)), các biểu thức thông thường sẽ chỉ thêm biến chứng. – maerics

Trả lời

3

Bạn nên phân tích cú pháp của mình chuỗi tìm kiếm để thay đổi dấu chấm . thành dấu chấm RegEx: \\.. Lưu ý rằng a single dot is a metacharacter in Regular Expressions và có nghĩa là bất kỳ ký tự nào. Ví dụ, bạn có thể thay thế tất cả các dấu chấm trong chuỗi của bạn cho \\.

Nếu bạn không muốn làm tất cả những gì công việc, sau đó chỉ cần gửi java\\. như chuỗi tìm kiếm bạn

Thông tin thêm:

Mã dụ:

public static void main(String[] args) { 
    String fileContent = "Hi i am learning java."; 
    String searchString = "java"; 
    Pattern p = Pattern.compile(searchString); 
    Matcher m = p.matcher(fileContent); 
    while(m.find()) { 
     System.out.println(m.start() + " " + m.group()); 
    } 
} 

Nó sẽ in: 17 java

public static void main(String[] args) { 
    String fileContent = "Hi i am learning java."; 
    String searchString = "java\\."; 
    Pattern p = Pattern.compile(searchString); 
    Matcher m = p.matcher(fileContent); 
    while(m.find()) { 
     System.out.println(m.start() + " " + m.group()); 
    } 
} 

Nó sẽ in: 17 java. (chú ý dấu chấm cuối cùng)

EDIT: Là một rất cơ bản giải pháp, vì vấn đề duy nhất bạn có là dấu chấm, bạn có thể thay thế tất cả các dấu chấm trong chuỗi của mình bằng \\.

public static void main(String[] args) { 
    String fileContent = "Hi i am learning java."; 
    String searchString = "java."; 
    //this will do the trick even if the "searchString" doesn't contain a dot inside 
    searchString = searchString.replaceAll("\\.", "\\."); 
    Pattern p = Pattern.compile(searchString); 
    Matcher m = p.matcher(fileContent); 
    while(m.find()) { 
     System.out.println(m.start() + " " + m.group()); 
    } 
} 
+0

Ôi trời, nó không tìm kiếm "java". một mình. Các từ có thể khác nhau và tệp đầu vào cũng khác nhau. Có thể là bất kỳ từ nào kết thúc bằng khoảng thời gian –

+0

@VijayĐây và đây chỉ là một ví dụ, nó không có ý định nói cách bạn nên triển khai giải pháp. –

+0

@VijayAnand answer updated. –

0
"\\b" + searchstring + "(?:\\.|\\b)" 

Nếu bạn muốn quy định rằng các dấu chấm phải được theo sau bởi một nhân vật phi từ hoặc cuối của chuỗi, bạn có thể thêm một cái nhìn về phía trước tích cực

"\\b" + searchstring + "(?:\\.(?=\\W|$)|\\b)" 
0
Pattern p = Pattern.compile(".*\\W*" + searchWord + "\\W*.*", Pattern.CASE_INSENSITIVE); 

Để hoàn toàn chắc chắn, ở trên nói "tìm cho tôi một chút văn bản bắt đầu bằng 0 hoặc nhiều ký tự, tiếp theo là 0 hoặc nhiều ký tự không phải từ cụ thể (\ W * - ranh giới từ) theo sau từ tìm kiếm, tiếp theo là ranh giới từ tiếp theo theo sau bởi bất kỳ thứ gì khác ".

Điều này sẽ phục vụ cho các tình huống mà từ tìm kiếm ở đầu tệp, ở phần cuối hoặc giữa dấu chấm câu, ví dụ: "hi, tôi đang học, java".

Hy vọng điều này sẽ giúp ...

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