2010-09-13 45 views
11

Đây là mã của tôi:Tìm tất cả các chuỗi "the" trong tập tin .txt

// Import io so we can use file objects 
import java.io.*; 

public class SearchThe { 
    public static void main(String args[]) { 
     try { 
      String stringSearch = "the"; 
      // Open the file c:\test.txt as a buffered reader 
      BufferedReader bf = new BufferedReader(new FileReader("test.txt")); 

      // Start a line count and declare a string to hold our current line. 
      int linecount = 0; 
       String line; 

      // Let the user know what we are searching for 
      System.out.println("Searching for " + stringSearch + " in file..."); 

      // Loop through each line, stashing the line into our line variable. 
      while ((line = bf.readLine()) != null){ 
       // Increment the count and find the index of the word 
       linecount++; 
       int indexfound = line.indexOf(stringSearch); 

       // If greater than -1, means we found the word 
       if (indexfound > -1) { 
        System.out.println("Word was found at position " + indexfound + " on line " + linecount); 
       } 
      } 

      // Close the file after done searching 
      bf.close(); 
     } 
     catch (IOException e) { 
      System.out.println("IO Error Occurred: " + e.toString()); 
     } 
    } 
} 

tôi muốn tìm một số từ "the" trong test.txt tập tin. Vấn đề là khi tôi tìm thấy "số" đầu tiên, chương trình của tôi ngừng tìm kiếm thêm.

Và khi một số từ như "thì" chương trình của tôi hiểu nó là từ "số".

+0

Bạn đã cân nhắc sử dụng gói regex của Java (java.util.regex) chưa? – GobiasKoffi

+0

Bạn có thể tìm thấy một số ví dụ hữu ích tại đây.http: //java.sun.com/developer/technicalArticles/releases/1.4regex/ – Emil

Trả lời

15

Sử dụng Regexes trường hợp insensitively, có ranh giới từ để tìm tất cả các trường và các biến thể của "các".

indexOf("the") không thể phân biệt giữa "the""sau đó" vì mỗi bắt đầu với "the". Tương tự, "the" được tìm thấy ở giữa "anathema".

Để tránh điều này, hãy sử dụng regexes và tìm kiếm "the", với các đường biên từ (\b) ở hai bên. Sử dụng ranh giới từ, thay vì chia nhỏ trên "" hoặc chỉ sử dụng indexOf(" the ") (khoảng trắng ở hai bên) sẽ không tìm thấy "the". và các trường hợp khác bên cạnh dấu chấm câu.Bạn cũng có thể làm trường hợp tìm kiếm của mình một cách vô cảm để tìm kiếm số "The".

Pattern p = Pattern.compile("\\bthe\\b", Pattern.CASE_INSENSITIVE); 

while ((line = bf.readLine()) != null) { 
    linecount++; 

    Matcher m = p.matcher(line); 

    // indicate all matches on the line 
    while (m.find()) { 
     System.out.println("Word was found at position " + 
         m.start() + " on line " + linecount); 
    } 
} 
+3

+1 để sử dụng regex, tốt hơn nhiều so với các tùy chọn 'tách' khác (bao gồm cả tôi). –

3

Bạn không nên sử dụng indexOf vì nó sẽ tìm thấy tất cả chuỗi con có thể có trong chuỗi của bạn. Và bởi vì "sau đó" chứa chuỗi "the", do đó, nó cũng là một chuỗi con tốt.

More about indexOf

indexOf

public int indexOf (String str, int fromIndex) Trả về chỉ số trong chuỗi này về sự xuất hiện đầu tiên của chuỗi quy định, bắt đầu từ chỉ số quy định . Số nguyên được trả về là giá trị nhỏ nhất k mà:

Bạn nên tách dòng thành nhiều từ và lặp lại từng từ và so sánh với "từ".

String [] words = line.split(" "); 
for (String word : words) { 
    if (word.equals("the")) { 
    System.out.println("Found the word"); 
    } 
} 

Đoạn mã trên cũng sẽ lặp lại tất cả "có thể" trong dòng cho bạn. Sử dụng indexOf sẽ luôn trả về bạn lần xuất hiện đầu tiên

+2

Đây không phải là câu trả lời. Đó là một lời chỉ trích. – Asaph

+2

Đầu tiên, tôi chỉ cố gắng tìm ra vấn đề mà anh ta có, và phương pháp indexOf là vấn đề. Sau đó, tôi tìm một cách khác, tốt để làm những gì anh ta muốn. Có gì sai không? – vodkhang

+1

Có - bạn đang tìm kiếm. Viết câu trả lời hoàn chỉnh trước khi đăng. –

-1

Bạn nên sử dụng Regular Expressions cho loại tìm kiếm này. Là một workaround dễ dàng/bẩn bạn có thể sửa đổi stringSearch của bạn từ

String stringSearch = "the"; 

để

String stringSearch = " the "; 
+0

Không thích hợp cho sự kết thúc hoặc bắt đầu của dòng –

+0

Điều này sẽ không hoạt động nếu "the" là lúc bắt đầu dòng, cuối dòng, ngay trước một ký tự đặc biệt hoặc chữ hoa. –

0

thực hiện hiện tại của bạn sẽ chỉ tìm thấy trường hợp đầu tiên của 'the' trên mỗi dòng.

Cân nhắc tách mỗi dòng diễn tả bằng lời, lặp lại trong danh sách các từ, và so sánh mỗi từ để 'the' thay vì:

while ((line = bf.readLine()) != null) 
{ 
    linecount++; 
    String[] words = line.split(" "); 

    for (String word : words) 
    { 
     if(word.equals(stringSearch)) 
      System.out.println("Word was found at position " + indexfound + " on line " + linecount); 
    } 
} 
0

Có vẻ như điểm tập thể dục là kỹ năng của bạn trong biểu thức chính quy (tôi không biết có thể ... nhưng có vẻ hơi cơ bản cho điều đó), mặc dù regex thực sự sẽ là giải pháp thực tế cho những thứ như thế này.

Lời khuyên của tôi là tập trung vào các khái niệm cơ bản, sử dụng chỉ mục và chuỗi con để kiểm tra chuỗi. Hãy suy nghĩ về cách bạn có thể giải thích cho tính chất tự nhiên nhạy cảm của các chuỗi. Ngoài ra, trình đọc của bạn luôn bị đóng (tức là có cách nào bf.close() sẽ không được thực hiện) không?

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