2009-11-12 5 views
0

Je suis nouveau dans les expressions régulières et j'ai besoin d'écrire un ensemble d'expressions régulières qui correspondent à différents formats de paquets de données. Mon problème est que, habituellement, je n'ai besoin que de rechercher les parties de début et de fin du paquet pour les distinguer, les données intermédiaires ne sont pas pertinentes.Détection de paquets à l'aide de la regex

Quelle est la manière la plus efficace d'ignorer les données entre le début et la fin?

Voici un exemple simple. Le paquet que je cherche commence par $ CH; et se termine par #

Actuellement, mon regex est \$CH;.*?#

C'est le. *? Je m'inquiète de. Y a-t-il une meilleure façon (ou plus efficace) d'accepter n'importe quel caractère entre l'en-tête du paquet et le caractère de fin?

En outre, certains des paquets ont \ n caractères dans les données, en utilisant ainsi. ne fonctionnera pas du tout si cela signifie [^ \ n].

J'ai également pris en compte [^\x00]*? pour détecter des caractères, car null n'est jamais utilisé dans les données.

Des suggestions?

Répondre

4

\$CH;.*?# est très bien et devrait être tout à fait efficace. Vous pouvez rendre plus explicite qu'il ne devrait pas y avoir de retour en arrière en l'écrivant \$CH;[^#]*#, si vous le souhaitez.

Vous pouvez utiliser (.|\n) ou [\w\W] pour correspondre vraiment un caractère - ou mieux encore, utilisez l'option RegexOptions.Singleline pour modifier le comportement de .:

Indique un mode unique en ligne. Modifie la signification du point (.) afin qu'il corresponde à tous les caractères (au lieu de tous les caractères sauf \n).

+0

J'aime \ $ CH; [^ #] * # meilleur jusqu'ici. Question: si j'ai utilisé \ $ CH; [^ #] *? # À la place, le point d'interrogation serait-il purement redondant? – CodeFusionMobile

+0

Oui, ce serait redondant. –

1

Essayez ceci:

\$CH;[\s\S]*?# 
0

Je recommande de vérifier les séquences initiales et terminales séparément en utilisant des expressions régulières ancrées.

+0

Impossible. Le paquet que j'essaie de faire correspondre est au milieu d'un ensemble de données essentiellement aléatoire, donc il n'y a rien à ancrer. – CodeFusionMobile

+0

@CSharperWithJava OK, je ne m'en suis pas rendu compte. Dans ce cas, si les paquets ne peuvent pas être vides, utilisez '\ $ CH; [^ #] + #'. –

1

Pour détecter début de ligne/données utilisent l'ancre ^, pour détecter la fin, utilisez $ ancre:

^start.*?end$ 

Soyez conscient que .*? peut ne pas correspondre à des sauts de ligne, une option est de changer pour [\s\S]*?

+0

Impossible. Le paquet que j'essaie de faire correspondre est au milieu d'un ensemble de données essentiellement aléatoire, donc il n'y a rien à ancrer. – CodeFusionMobile

Questions connexes