2010-09-13 10 views
11

Aquí está mi código:Encuentra toda la cadena "la" en el archivo .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()); 
     } 
    } 
} 

Quiero encontrar alguna palabra "la" en test.txt archivo. El problema es cuando encontré el primer "the", mi programa deja de encontrar más.

Y cuando alguna palabra como "y luego" mi programa a entender que como la palabra "la".

+0

¿Ha considerado usar el paquete regex de Java (java.util.regex)? – GobiasKoffi

+0

Puede encontrar algunos ejemplos útiles aquí.http: //java.sun.com/developer/technicalArticles/releases/1.4regex/ – Emil

Respuesta

15

Usar expresiones regulares insensiblemente, con límites de las palabras para encontrar todas las instancias y las variaciones de "el".

indexOf("the") no puede discernir entre "la" y "y luego" ya que cada uno comienza con "la". Del mismo modo, "the" se encuentra en el medio de "anatema".

Para evitar esto, utilice expresiones regulares, y busque "la", con límites de palabras (\b) a cada lado. Use los límites de las palabras, en lugar de dividir en "", o usando solo indexOf(" the ") (espacios en cualquier lado) que no encontrarían "the." y otras instancias al lado de la puntuación.También puede hacer su búsqueda insensiblemente para encontrar "The" también.

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 para uso de expresiones regulares, mucho mejor que las otras opciones de "división" (incluida la mía). –

3

No debe usar indexOf porque encontrará toda la subcadena posible que tenga en su cadena. Y porque "then" contiene la cadena "the", por lo que también es una buena subcadena.

More about indexOf

indexOf

int (String str, int fromIndex) indexOf pública Devuelve el índice dentro de esta cadena de la primera ocurrencia de la subcadena especificada, comenzando en el índice especificado . El entero devuelto es el valor k pequeña para la cual:

Usted debe separar las líneas en muchas palabras y lazo sobre cada palabra y comparar con "la".

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

El fragmento de código anterior también recorrerá todos los "posibles" posibles en la línea por usted. El uso de indexOf siempre le devolverá la primera incidencia

+2

Esto no es una respuesta. Es una crítica – Asaph

+2

Primero, intenté encontrar el problema que tenía, y el método indexOf es el problema. Luego, encuentro otra buena forma de hacer lo que él quiere. ¿Nada malo? – vodkhang

+1

Sí, eres punto cebo. Escribe una respuesta completa antes de publicar. –

-1

Es mejor que use Regular Expressions para este tipo de búsqueda. Como solución fácil/sucio que podría modificar stringSearch de

String stringSearch = "the"; 

a

String stringSearch = " the "; 
+0

No acomoda el final o el inicio de la línea –

+0

Esto no funcionará si "the" está al comienzo de la línea, el final de la línea, justo antes de un carácter especial, o mayúscula. –

0

Su implementación actual sólo encontrará la primera instancia de 'la' por línea.

considerar dividir cada línea en palabras, la iteración en la lista de palabras, y la comparación de cada palabra para 'el' lugar:

caso
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

No suena como el objetivo del ejercicio es que la habilidad en expresiones regulares (no sé que puede ser ... pero parece un poco básico para eso), aunque Regexs sería la solución real para cosas como esta.

Mi consejo es que se concentre en los conceptos básicos, utilice el índice de y la subcadena para probar la cadena. Piense en cómo podría explicar la naturaleza sensible a las mayúsculas y minúsculas de las cadenas. Además, ¿su lector siempre se cierra (es decir, ¿hay alguna manera de que bf.close() no se ejecute)?

Cuestiones relacionadas