2015-06-28 18 views
9

NodeJS öğrenme yolculuğum sırasında, bu örnek kodu başka bir akıştan gelen verilerdeki bazı eşleşmeleri bulmak için akışları kullanan bir kitapta (Uygulamada NodeJS) buldum.Bu kodun bazı maçları kaybetmesi mümkün mü?

var Writable = require('stream').Writable; 
var util = require('util'); 
module.exports = CountStream; 
util.inherits(CountStream, Writable); 

function CountStream(matchText, options) { 
    Writable.call(this, options); 
    this.count = 0; 
    this.matcher = new RegExp(matchText, 'ig'); 
} 

CountStream.prototype._write = function(chunk, encoding, cb) { 
    var matches = chunk.toString().match(this.matcher); 
    if (matches) { 
     this.count += matches.length; 
    } 
    cb(); 
}; 

CountStream.prototype.end = function() { 
    this.emit('total', this.count); 
}; 

Ve akışını kullanan kod: Bazı maçları kaybetmeye

var CountStream = require('./countstream'); 
var countStream = new CountStream('book'); 
var http = require('http'); 

http.get('http://www.manning.com', function(res) { 
    res.pipe(countStream); 
}); 

countStream.on('total', function(count) { 
    console.log('Total matches:', count); 
}); 

mümkün değil midir iki veri parçalar halinde bir maç kırılırsa?

Örneğin, verilerin ilk kısmı içerir. Bu bir bo ' ve diğer yığın ' tamam benim içerir. ', hiç kimse numaralı kitabın numaralı kitabını bağımsız olarak içermediğinden, tüm veriler numaralı kitabı içermektedir.

Tüm maçları bulmak için en iyi çözüm ne olurdu?

+0

Çok iyi lekeli. Evet, maçları kaybedebileceğini söyleyebilirim. Muhtemelen çok sık değil, çünkü parçaların büyük olacağını tahmin ediyorum, bu da ara sıra kesintiye neden olur - en kötü böcek türüdür. – James

+2

Gerçekten de öyle. Ayrıca, desen boyutu yığın boyutundan daha büyükse (çoğu kullanım durumları için genellikle çok fazla sorun olmayan). Bundan kaçınmanın bir yolu - yalnızca alt dizgi eşleşmeleri bulmanız gerekiyorsa - [KMP] kullanmanız gerekir (https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) veya akışa dayalı bir şekilde çalışacak herhangi bir başka algoritma. @James: Beni buna döv! Ben yavaş tipçiyim. İç çekmek. – galactocalypse

+0

Gerçekten regex'e mi ihtiyacınız var, yoksa sade maçlar mı arıyorsunuz? – Bergi

cevap

1

Yani, benim yorumlarımda açıkladığım gibi, regex'inizle eşleşen maksimum uzunlukları biliyorsanız (max uzunluğunu hesaplamak için, https://stackoverflow.com/a/31173778/4114922 numaralı telefondan çok iyi cevaba bakın), önceki parçayı önbelleğe alabilir ve birleştirebilirsiniz yeni yığın için. Bu yöntemle, herhangi bir eşleşmeyi kaybetmeyeceğinizi düşünüyorum.