2011-01-19 6 views
1

J'ai 40KB page HTML et je veux trouver certains modèles.Trouver des motifs dans une longue chaîne?

Je peux le lire par tampon 1K mais je veux éviter la situation que le modèle que je cherche serait divisé entre deux lectures de tampon.

Comment surmonter ce problème?

Répondre

3

C'est facile. Vous comptez le motif le plus long que vous rechercherez, puis revenez en arrière sur le pointeur de fichier d'une certaine quantité, ou vous faites défiler le fichier, en ne lisant que le delta. Imaginez que le motif le plus long soit 26 octets.

  1. Lecture de 1k.
  2. Vérifiez tous les motifs -> rien.
  3. Supprime 1k - 26 octets du tampon.
  4. Lire 1k - 26 octets de flux et ajouter à votre tampon
  5. Aller à 2.

Edit: Permettez-moi de préciser: Il existe deux méthodes pour ce faire, les deux ont leurs mérites. Celui que j'ai documenté ci-dessus est mieux utilisé si vous lisez un flux, ce qui signifie une source de données qui ne supporte pas la recherche. Si, toutefois, votre source de données supporte la recherche (comme un fichier de système de fichiers), vous pouvez facilement faire la même chose avec seek. Vérifiez le motif, s'il n'est pas trouvé, recherchez la taille de votre motif le plus long, puis recommencez à partir de là. Toutefois, si vous souhaitez prendre en charge la recherche de motifs plus longs que la taille de votre tampon, vous aurez peut-être besoin d'un algorithme beaucoup plus intelligent. Vous auriez besoin d'une table de recherche de tous les modèles qui sont actuellement "ouverts" lorsque vous contnuez de lire plus de données, ce qui à son tour vous coûtera plus de mémoire - vous obtenez le problème.

+0

Espérons juste que sa longueur de la plus longue chaîne n'est pas 1k-1 :) –

+0

Bonne idée, mais cela ne fonctionne que s'il recherche des caractères exacts. Que faire si le modèle - tout entre quelques balises html. Sa longueur est imprévisible. –

+0

Si la longueur est imprévisible, bien sûr je prédis une longueur plus grande que sa taille de tampon. Ce qui signifie qu'il a plus de problèmes qu'il ne le sait :) – 0xCAFEBABE

0

Pourquoi ne pas utiliser un SAX parser. Il est construit pour gérer de gros fichiers de balisage. Vous pourriez rencontrer des problèmes si vous essayez de faire correspondre à travers différents éléments au même niveau. Cependant, ce n'est pas impossible à gérer

+0

L'analyseur SAX échouera sur la mauvaise syntaxe HTML, donc je ne peux pas l'utiliser. – pixel

Questions connexes