Bibliothèque regex de Javascript avec test incrémental

Je recherche une bibliothèque JavaScript (idéalement un paquet node.js) qui peut vérifier si une chaîne correspond à une expression régulière de façon incrémentielle (c.-à-d. Un caractère à la fois) et renvoie des résultats indéterminés. Par exemple, disons que j'ai le regex suivant:

j.*s.* 

Et je veux tester la chaîne "javascript". Je voudrais une API semblable à la suivante:

 var iregex = new IncrementalRegex('j.*s.*'); var matcher = iregex.createMatcher(); matcher.append('j'); matcher.test(); //returns "possible match" matcher.append('a'); matcher.test(); //returns "possible match" matcher.append('v'); matcher.append('a'); matcher.append('s'); matcher.test(); //returns "match found" matcher.append('ript'); matcher.test(); //returns "match found" 

Alors que si j'ai testé la chaîne "foo", j'attends quelque chose comme ça:

 var matcher2 = iregex.createMatcher(); matcher.append('f'); matcher.test(); //returns "no match possible" //At this point I wouldn't bother appending "oo" because I know that no match is possible. 

EDIT: Pour être clair, append construire la chaîne testée. Un nouveau matcher commence à tester contre la chaîne vide, et après un matcher.append ('foo') il correspond à foo. AppendToString ou buildUpString pourrait avoir été un meilleur nom à utiliser.

De plus, j'ai une idée de la façon dont cela pourrait être fait, mais je n'en ai pas encore réfléchi. Peut-être est-il possible de construire un regex "Match de potentiel" à partir du regex original qui correspondra aux chaînes si et seulement si elles constituent le début d'une chaîne, le regex original correspond.

Si vos règles d'analyseur n'utilisent que des expressions régulières de langage formel (c.-à-d. Pas de références arrière, de lookaheads ou de lookbehinds), vous pouvez les traduire en NFA (en utilisant la construction de Thompson ou similaire), puis pousser chaque personnage à travers l'algorithme de simulation NFA à deux couches standard : S'il n'y a pas de transition sur le personnage, vous avez "non"; S'il y en a un et que vous avez un état final dans votre état actuel, vous avez "oui"; Sinon vous avez "peut-être".

Votre "IncrementalRegex" peut être implémenté à l'aide d'un objet RegExp encapsulé.

 function Matcher(pattern, flags) { this.setExpression(pattern, flags); } Matcher.prototype.setExpression = function(pattern, flags) { this.pattern = pattern; this.flags = flags; this.re = new RegExp(this.pattern, this.flags); }; Matcher.prototype.append = function(pattern) { this.setExpression(this.pattern + pattern, this.flags); }; Matcher.prototype.test = function(str) { return this.re.test(str); }; var matcher = new Matcher('j.*s.*', 'i'), str = 'JavaScript'; function test() { console.log(matcher.re.source, ':', matcher.test(str)); } test(); // true matcher.append('ri'); test(); // true matcher.append('.t'); test(); // true matcher.append('whatever'); test(); // false​ 

http://jsfiddle.net/f0t0n/Nkyyd/

Pouvez-vous décrire les exigences professionnelles exactes? Peut-être trouverons-nous un moyen plus élégant pour la mise en œuvre de votre tâche.