2009-05-15 6 views
16

Disons que je dois faire correspondre un motif s'il apparaît 3 ou 6 fois de suite. Le plus proche que je puisse obtenir est quelque chose comme \ d {3,6} mais ça ne fait pas vraiment ce dont j'ai besoin.expressions régulières: correspondance x fois OU fois

« 123 » doit correspondre
« 123456 » doit correspondre
« 1234 » ne devrait pas correspondre

Répondre

26
^(\d{3}|\d{6})$ 

Vous devez avoir une sorte de terminaison sinon \d{3} correspondra 1234. Voilà pourquoi je mets^et $ ci-dessus. Une alternative consiste à utiliser lookarounds:

(?<!\d)(\d{3}|\d{6})(?!\d) 

pour vous assurer qu'il n'est pas précédée ou suivie d'un chiffre (dans ce cas). Plus dans Lookahead and Lookbehind Zero-Width Assertions.

+0

Cela semble bien, merci. Mais que faire si le motif est beaucoup plus grand que juste \ d? Je suppose que je pourrais faire une interpolation de chaîne lors de la construction de l'expression régulière, mais y a-t-il une meilleure façon de réutiliser les sous-patterns? –

+0

Dans ce cas, vous voudrez utiliser le format {1,2}, c'est-à-dire (() {3}) {1,2} –

5

Que diriez-vous:

(\d\d\d){1,2} 

bien que vous aurez également besoin de gardes à chaque extrémité qui dépendent de votre moteur de RE, quelque chose comme:

[^\d](\d\d\d){1,2}[^\d] 

ou:

^(\d\d\d){1,2}$ 
1

Le premier correspond à 3, 6 mais aussi 9, 12, 15, .... Deuxième regarde à droite. Voici une autre torsion:

\d{3}\d{3}? 
+6

Première et deuxième quoi? Si vous parlez de la réponse de quelqu'un d'autre, vous devriez dire lequel. Ces réponses n'apparaissent pas toujours dans le même ordre. –

Questions connexes