une de mes questions aux devoirs a demandé de développer une expression rationnelle pour toutes les chaînes sur x,y,z
qui ne contenait pas xxx
Regex pour correspondre à une chaîne qui ne contient pas « xxx »
Après avoir fait un peu de lecture que j'ai découvert préanalyse négatif et ce qui fit fonctionne très bien:
(x(?!xx)|y|z)*
Pourtant, dans l'esprit d'exhaustivité, est de toute façon d'écrire cela sans négatif préanalyse? La lecture que j'ai faite me fait penser qu'il peut être fait avec une certaine combinaison de carets
(^)
, mais je ne peux pas obtenir la bonne combinaison donc je ne suis pas sûr.
Prenant un peu plus loin, est-il possible d'exclure une chaîne comme xxx
en utilisant uniquement l'opérateur or
(|)
, mais toujours vérifier les cordes d'une manière récursive?
EDIT 9/6/2010:
pense avoir répondu à ma propre question. Je me suis trompé un peu plus, essayant de faire cette regex avec seulement or
(|)
des déclarations et je suis assez sûr que je l'ai compris ... et ce n'est pas aussi désordonné que je pensais que ce serait. Si quelqu'un d'autre a le temps de vérifier cela avec un oeil humain, je l'apprécierais.
(xxy|xxz|xy|xz|y|z)*(xxy|xxz|xx|xy|xz|x|y|z)
typoknig - J'ai mis à jour ma réponse en fonction de votre dernière modification. Je suis assez intrigué cependant - le motif est essentiellement une version plate de mon premier motif. 'x {0,2}' peut être écrit comme '| x | xx', et' a (b | c) 's'écrit' ab | ac' - pourquoi préférez-vous le second dans chaque cas? – Kobi
En fait, je préfère ma première réponse car elle semble la plus directe, mais mes professeurs sont des puristes et je crois qu'ils préféreraient que je n'utilise que les éléments regex les plus basiques, et par basic je veux dire (|) 'et' (*) '. – ubiquibacon