2008-10-16 2 views
11

J'ai cette regex, j'ai construit et testé dans buddy regex.Qu'est-ce qu'un "Quantifier imbriqué" et pourquoi fait-il échouer mon regex?

"_ [ 0-9]{10}+ {1}+[ 0-9]{10}+ {2}+[ 0-9]{6}+ {2}[ 0-9]{2}" 

Quand j'utiliser dans .Net C#

Je reçois l'exception

"parsing \"_ [ 0-9]{10}+ +[ 0-9]{10}+ +[ 0-9]{6}+ [ 0-9]{2}\" - Nested quantifier +." 

Que signifie cette erreur? Apparemment, .net n'aime pas l'expression.

est ici le copain de regex si u peut comprendre mon intention avec le motif ...

_ [ 0-9]{10}+ {1}+[ 0-9]{10}+ {2}+[ 0-9]{6}+ {2}[ 0-9]{2} 

Match the characters "_ " literally «_ » 
Match a single character present in the list below «[ 0-9]{10}+» 
    Exactly 10 times «{10}+» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 
Match the character " " literally « {1}+» 
    Exactly 1 times «{1}+» 
Match a single character present in the list below «[ 0-9]{10}+» 
    Exactly 10 times «{10}+» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 
Match the character " " literally « {2}+» 
    Exactly 2 times «{2}+» 
Match a single character present in the list below «[ 0-9]{6}+» 
    Exactly 6 times «{6}+» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 
Match the character " " literally « {2}» 
    Exactly 2 times «{2}» 
Match a single character present in the list below «[ 0-9]{2}» 
    Exactly 2 times «{2}» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 

En bref ...

Qu'est-ce qu'un Nested quantificateurs?

Répondre

9

.NET se plaint du + après le quantificateur de style {n} car cela n'a aucun sens. {n} signifie correspondre exactement n d'un groupe donné. + signifie correspondre à un ou plusieurs d'un groupe donné. Enlevez les + et ça va bien se compiler.

"_ [ 0-9]{10} {1}[ 0-9]{10} {2}[ 0-9]{6} {2}[ 0-9]{2}" 
+2

Dans certaines saveurs regex {min, max} + est un quantificateur possessif, mais .Net ne les supporte pas. Si vous utilisez Regex buddy, vous pouvez lui indiquer la saveur de regex avec laquelle vous travaillez en cliquant droit sur le volet de composition et en sélectionnant votre 'Flavor' dans la liste déroulante. – Grokodile

2

Ils ont raison. Cette version de votre regex ne manque pas:

(_ [ 0-9]{10})+(\s{1})+([ 0-9]{10})+(\s{2})+([ 0-9]{6})+\s{2}[ 0-9]{2}

Notez l'utilisation de parens pour créer des groupes qui peuvent ensuite répéter une ou plusieurs fois. En outre, vous devriez être plus précis et utiliser \ s à la place d'un espace, car les espaces de motif peuvent avoir ou non une signification.

BTW, cette regex ne semble pas si utile. Vous voudrez peut-être poser une autre question du type "Comment utiliser regex pour correspondre à ce modèle?"

+0

Eh bien, ce n'est qu'un extrait de la regex complète est-ce ... _ [0-9] {10} {1} [0-9] {10} {2} [0-9] {6} {2 } [0-9] {2} | _ [0-9] {10} {1} [0-9] {10} {2} [0-9] {6} {2} [0-9] { 2} | _ [0-9] {10} {1} [0-9] {10} {2} [0-9] {6} {2} [0-9] {2} Ses champs de retour tant que l'on n'est pas vide ... et j'aime l'idée. Merci – ctrlShiftBryan

+0

Je suis presque certain que regex pourrait être réduit à grands pas. Sérieusement, posez une question sur la façon de le faire et fournissez quelques exemples de données. – Will

11

.NET ne prend pas en charge le possessive quantifier

{10}+ 

Cependant, {10} doit avoir exactement le même effet. Le + évite de revenir en arrière et d'essayer des correspondances plus courtes si la correspondance la plus longue échoue, mais puisque {10} ne peut correspondre exactement qu'à 10 caractères pour commencer, cela n'obtient pas beaucoup de résultats.

"_ [ 0-9]{10} [ 0-9]{10} {2}[ 0-9]{6} {2}[ 0-9]{2}" 

devrait être bien. J'ai également supprimé le bit "{1} +". Comme il correspond exactement une fois, "A {1} +" équivaut à "A".

EDIT Comme le dit Porges, si vous avez besoin quantificateurs possessifs dans .NET, puis des groupes atomiques donnent la même fonctionnalité avec (>[0-9]*) équivalente à [0-9]*+.

+0

Cool. N'a pas réalisé certains moteurs regex fourni cette option. – Duncan

+0

Je pense que vous devriez pouvoir émuler des quantificateurs possessifs en utilisant des groupes atomiques, c'est-à-dire au lieu de '[0-9] {10} +', utilisez '(?> [0-9] {10})'. – porges

2

Si vous sélectionnez la saveur .NET dans la barre d'outils en haut dans RegexBuddy, RegexBuddy indiquera que .NET ne prend pas en charge les quantificateurs possessifs tels que {10} +.

Puisque {10} n'autorise qu'un nombre spécifique de répétitions, le rendre paresseux ou possessif est inutile, même s'il est syntaxiquement valide dans les arômes regex qui supportent les quantificateurs paresseux et/ou possessive. En supprimant les signes + de votre expression régulière, cela fonctionnera correctement avec .NET.

Dans d'autres situations, double-cliquez sur l'erreur concernant le quantificateur possessif dans l'onglet Créer de RegexBuddy. RegexBuddy remplacera alors le quantificateur possessive par un groupe atomique fonctionnellement équivalent. Si vous générez un extrait de code source pour un langage .NET sous l'onglet Utiliser dans RegexBuddy, RegexBuddy remplacera automatiquement les quantificateurs possessifs dans l'expression régulière dans l'extrait de code source.