2009-12-09 3 views
0

У меня есть небольшая программа java, которая ищет содержимое всех * .txt файлов в папке для определенной строки.Поиск точного соответствия возвращает подстроки.

Пример моей проблемы:

  1. Введите строку для поиска:
  2. Введите строку для поиска: 6570
  3. Введите строку для поиска: 6570
    Найдено 2 раз (а) в kyle.txt !
    Найдено 2 раз (а) в kylezz.txt!
    Нажмите любую клавишу, чтобы продолжить. , ,

Проблема:

Он ищет 6570, однако I результаты съемки для значений, как это с этой строкой:

 
11111116570111111 
657011111 
111116570 
6570 

Вопрос: Я хочу, чтобы искать только точная строка, например: «6570». как я могу вернуть его только точное значение 6570? Я не хочу никаких дополнительных символов в начале или конце, только точное значение.

Вот мой код:

import java.io.*; 
import java.util.*; 

public class FileScanner { 

    public static void main(String args[]) { 

     System.out.print("Enter string to find: "); 
     Scanner sc = new Scanner(System.in); 
     find(sc.nextLine()); 

    } 

    public static void find(String delim) { 
     File dir = new File("files"); 
     if (dir.exists()) { 
      String read; 
      try { 
       File files[] = dir.listFiles(); 
       for (int i = 0; i < files.length; i++) { 
        File loaded = files[i]; 
        if (loaded.getName().endsWith(".txt")) { 
         BufferedReader in = new BufferedReader(new FileReader(
           loaded)); 
         StringBuffer load = new StringBuffer(); 
         while ((read = in.readLine()) != null) { 
          load.append(read + "\n"); 
         } 
         String delimiter[] = new String(load).split(delim); 
         if (delimiter.length > 1) { 
          System.out.println("Found " 
            + (delimiter.length - 1) + " time(s) in " 
            + loaded.getName() + "!"); 
         } 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 
      System.out.println("error: dir wasn't found!"); 
     } 
    } 
} 

Спасибо, ребята, я действительно надеюсь, что вы можете помочь мне с моей проблемой программирования. Я пытаюсь исправить это примерно месяц, и теперь я прошу помощи.

+0

Формат исходного кода или его невозможно прочитать – rachvela

ответ

0

Будет что-то вроде этой работы?

public static void find(String delim) { 
    File dir = new File("/tmp/files"); 
    Pattern strPattern = Pattern.compile(delim); 
    if (dir.exists()) { 
     try { 
      for(File curFile : dir.listFiles()){ 
       if(!curFile.getName().endsWith(".txt")){continue;} 
       BufferedReader in = new BufferedReader(new FileReader(
         curFile)); 
       int foundCount = 0; 
       String read = null; 
       while ((read = in.readLine()) != null) { 
       if(strPattern.matcher(read).matches()){ 
        foundCount ++; 
       } 
       } 
       System.out.println("Found "+ delim +" "+ foundCount + " time(s) in "+curFile); 

      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } else { 
     System.out.println("error: dir wasn't found!"); 
    } 
} 
+0

Как это избежать вопроса соответствия подстрок? –

+0

Точный шаблон. Я провел его против своего входного файла, и он соответствовал только одной строке. – Kylar

0

Вместо этого:

String delimiter[] = new String(load).split(delim); 
             if(delimiter.length > 1) { 
               System.out.println("Found " + (delimiter.length - 1) + " time(s) in " + loaded.getName() + "!"); 
             } 

вы можете использовать это, и я думаю, что вы получите то, что вы хотите:

String delimiter[] = new String(load).split(" "); 
int counter = 0; 
for(int i = 0; i < delimeter.length; i++){ 
    if(delimeter[i].equals(delim)) counter++; 
} 
System.out.println("Found " + counter + " time(s) in " + loaded.getName() + "!"); 
1

Очень простое решение было бы добавить пробелы на каждой стороне строку, которую вы ищете.

1

Вы не хотите рассматривать ваш поисковый запрос как разделитель. Если я правильно понял ваш вопрос, вы хотите совместить точные слов? Под словом «я» подразумеваются строковые символьные строки. Не вдаваясь в регулярные выражения, самое простое, что вы можете сделать, это:

int matchCount = 0; 

while((read = in.readLine()) != null) { 

    String[] words = read.split("\\s+"); // split the line on white space 

    for (String word : words) {    // loop thru the resulting word array 
     if (word.matches(searchTerm)) matchCount++;  // if exact match increment count 
    }         
} 

Если условие поиска был «7683» это будет соответствовать слово «7683», но не «67683» или «7683h» - это полное совпадение.

Смежные вопросы