2013-04-13 4 views
28

Disons que jeOU condition Regex

1 ABC Street 
1 A ABC Street 

Avec \d, il correspond (ce que je pense), avec \d \w, il correspond 1 A (expected). Maintenant, je combine le motif ensemble \d|\d \w, il ne correspond que le premier mais ignore le second.

Ma question est comment utiliser ou conditionner correctement dans ce cas particulier? PS: La condition est envelopper le nombre seulement quand il n'y a pas une seule lettre après cela, sinon envelopper le nombre et la lettre simple.

Par exemple: 1, rue ABC match numéro 1 seulement, mais quand 1 A rue ABC Enroulez le 1 A

+4

Vous ne devez pas nécessairement utiliser '|', par exemple: '\ d (\ w)?' –

+0

\ d (\ w)? doit résoudre votre puzzle. – HopeNick

Répondre

38

Essayez

\d \w |\d 

ou ajouter un positif si vous préanalyse ne voulez pas inclure l'espace de fuite dans le matchLorsque vous avez deux alternatives où l'une est une extension de l'autre, placez la plus longue en premier, sinon elle n'aura aucune chance d'être mise en correspondance.

16

Un classique "ou" serait |. Par exemple, ab|de correspond à chaque côté de l'expression. Toutefois, pour quelque chose comme votre cas, vous pouvez utiliser le quantificateur ?, qui correspond exactement à l'expression précédente 0 ou 1 fois (1 fois préféré, c'est-à-dire une correspondance "gourmande"). Un autre (probablement plus relyable) alternatif serait d'utiliser un groupe de caractères personnalisé:

\d+\s+[A-Z\s]+\s+[A-Z][A-Za-z]+ 

Ce modèle correspondra:

  • \d+: un ou plusieurs numéros.
  • : Un ou plusieurs espaces.
  • [A-Z\s]+: Un ou plusieurs caractères majuscules ou des caractères de l'espace
  • \s+: Un ou plusieurs espaces blancs.
  • [A-Z][A-Za-z\s]+: un caractère majuscule suivi d'au moins un autre caractère (majuscule ou minuscule) ou des espaces.

Si vous souhaitez un contrôle plus statique, par exempleEn effet, ne correspondent ABC et A ABC, alors vous pouvez combiner un (non-appariement) groupe et définir les solutions de remplacement (pour limiter le champ d'application):

\d (?:ABC|A ABC) Street 

Ou une autre alternative en utilisant un quantificateur:

\d (?:A)?ABC Street 
+0

Cela semble un peu stupide '\ s + [A-Z \ s] + \ s +' - pourquoi avez-vous besoin de faire correspondre les espaces blancs à trois endroits différents? Sûrement, soit [AZ \ s] + 'ou' \ s + [AZ] + \ s + 'a plus de sens ... –

+0

Hm, ouais, en y pensant, c'est un peu exagéré après avoir enlevé le" premier ou dernier être lettre "exigences. :) Modification ... ou non. C'est toujours utile, parce que de cette façon je force les espaces de début/de fin, tout en permettant aux crochets de correspondre à plusieurs mots. – Mario

+0

Sûrement que c'est un cas pour lookaround? –

8

Je pense que ce que vous devez peut-être simplement:

\d(\w)? 

Notez que votre regex aurait travaillé aussi si elle a été écrite comme \d \w|\d au lieu de \d|\d \w. C'est parce que dans votre cas, une fois que la regex correspond à la première option, \d, il cesse de chercher une nouvelle correspondance, pour ainsi dire.

+2

Je remue pour votre explication !!! –