web-dev-qa-db-fra.com

Le regex le plus court pour un nombre binaire avec un nombre pair de 0 ou un nombre impair de 1

Écrivez une expression contenant un nombre pair de 0 ou un nombre impair de 1

Je l'ai descendu à:

1*(01*01*)* + 0*10*(10*10*)*

où la première partie représente un nombre pair de 0 et la seconde partie un nombre impair de 1

Cependant, il est censé y avoir une solution simplifiée que je ne vois pas. Des conseils?

23
user3085290

Partie Odd-1s: 0*1(0|10*1)*

Even-0s part, dépend:

  1. La chaîne vide est correcte: (1|01*0)*
  2. No-0s est pair-0s: (1|01*0)+
  3. Doit avoir au moins deux 0: 1*(01*01*)+ (comme dans OP)

ancienne réponse: correcte dans les cas 1 et 2

(1*(01*0)*)+ | 0*1(0*(10*1)*)*

Félicitations à @OGHaza pour ses commentaires utiles.

18
Julián Urbano

En exploitant le fait que des chaînes de longueurs égales répondent TOUJOURS à vos contraintes:

^(([01]{2})*|1*(01*01*)*)$
11
Ruud Helderman

Définir "le plus court". Si vous recherchez le temps d’évaluation le plus court (c’est-à-dire le plus rapide), veillez à ne pas utiliser de groupes de capture. 

voici un exemple en javascript

^(?:1*(?:01*0)*)+|0*1(?:0*(?:10*1)*)*$

qui montre que 20% plus rapide que cette expression qui utilise des groupes de capture mais vous donnera la même réponse

^(1*(01*0)*)+|0*1(0*(10*1)*)*$
1
gillyspy

Avec le moins de symboles, 

1*(01*01*)*
0
Moses Kirathe

La solution la plus simplifiée que j'ai trouvée est:

1+0(0+1)((1+0)(1+0))*
0
Mehran