2011-01-21 3 views
3

J'ai une expression régulière que je suis en train de tester un flux de caractères d'entrée. Je me demande s'il existe un moyen de faire correspondre l'expression régulière avec l'entrée et de déterminer s'il s'agit d'une correspondance partielle qui consomme tout le tampon d'entrée? C'est à dire. la fin du tampon d'entrée est atteinte avant la fin de l'expression rationnelle. Je voudrais que l'implémentation décide s'il faut attendre plus de caractères d'entrée ou abandonner l'opération.Correspondance d'expression régulière partielle

En d'autres termes, je dois déterminer lequel est vrai:

  1. La fin du tampon d'entrée a été atteint avant l'expression rationnelle a été apparié

    Par ex "foo" =~ /^foobar/

  2. L'expression régulière correspond complètement

    Par ex "foobar" =~ /^foobar/

  3. L'expression régulière n'a pas réussi à égaler

    Par ex "fuubar" =~ /^foobar

L'entrée n'est pas mise en paquets.

Répondre

0

Est-ce le scénario que vous êtes en train de résoudre? Vous attendez une chaîne littérale, par ex. 'foobar'. Si l'utilisateur tape une correspondance partielle, par ex. 'foo', vous voulez continuer à attendre. Si l'entrée est une non-correspondance, vous voulez quitter.

Si vous travaillez avec des chaînes littérales je voudrais juste écrire une boucle pour tester les caractères dans l'ordre. Ou,

If (input.Length < target.Length && target.StartsWith(input)) 
    // keep trying 

Si vous essayez de faire correspondre les expressions régulières plus complexes, je ne sais pas comment faire cela avec des expressions régulières. Mais je commencerais par lire plus sur la façon dont la plate-forme implémente des expressions régulières.

tom

0

Je ne sais pas si cela est votre question, mais.
Les expressions régulières correspondent ou non. Et l'expression correspond à une quantité variable d'entrée. Donc, cela ne peut pas être déterminé directement.

Cependant, il est possible, si vous croyez qu'il ya une possibilité de chevauchement, d'utiliser un système de mise en mémoire tampon intelligent pour accomplir la même chose.

Il y a plusieurs façons de le faire. L'une des façons est de faire correspondre tout ce qui ne correspond pas par des assertions, jusqu'à ce que vous obteniez le début d'une correspondance (mais pas la correspondance complète que vous recherchez). Ceux-ci vous jetez simplement et effacez de votre tampon. Lorsque vous obtenez une correspondance que vous recherchez, effacez le tampon de ces données et données avant.

Exemple: /(<function.*?>)|([^<]*)/ La partie de jeter/clair de la mémoire tampon est dans le groupe 2 mémoire tampon de capture.Une autre façon est que si vous faites correspondre des chaînes de longueur finie, si vous ne trouvez rien dans le tampon, vous pouvez jeter tout en toute sécurité depuis le début du tampon jusqu'à la fin du tampon moins la longueur du chaîne finie que vous recherchez.

Exemple: Votre tampon a une taille de 64k. Vous recherchez une chaîne de longueur 10. Elle n'a pas été trouvée dans le tampon. Vous pouvez effacer (64k - 10) octets en toute sécurité, en conservant les 10 derniers octets. Puis ajouter (64k-10) octets à la fin du tampon. Bien sûr, vous avez seulement besoin d'un tampon de taille 10 octets, en supprimant/ajoutant constamment 1 caractère mais un tampon plus grand est plus efficace et vous pouvez utiliser des seuils pour recharger plus de données.

Si vous pouvez créer un tampon qui se contracte/se dilate facilement, davantage d'options de mise en mémoire tampon sont disponibles.

Questions connexes