La catégorie de chaînes que vous décrivez s'appelle Context Free Grammar et est connue pour être en dehors de ce pour quoi une expression régulière peut être utilisée. Toutefois, si vous limitez les chaînes à une longueur particulière, il existe des expressions régulières qui peuvent être utilisées pour toutes les chaînes correspondant à ce modèle dans cette longueur.Par exemple:
Toutes les chaînes correspondant au motif d'une longueur de 2 ou moins: (PA|NY|OH|WV)
Toutes les chaînes correspondant au motif d'une longueur de 4 ou moins: (P(PA|NY|OH|WV)A|N(PA|NY|OH|WV)Y|O(PA|NY|OH|WV)H|W(PA|NY|OH|WV)V)
Toutes les chaînes correspondant au motif de longueur 6 ou less: (P(P(PA|NY|OH|WV)A|N(PA|NY|OH|WV)Y|O(PA|NY|OH|WV)H|W(PA|NY|OH|WV)V)A|N(P(PA|NY|OH|WV)A|N(PA|NY|OH|WV)Y|O(PA|NY|OH|WV)H|W(PA|NY|OH|WV)V)Y|O(P(PA|NY|OH|WV)A|N(PA|NY|OH|WV)Y|O(PA|NY|OH|WV)H|W(PA|NY|OH|WV)V)H|W(P(PA|NY|OH|WV)A|N(PA|NY|OH|WV)Y|O(PA|NY|OH|WV)H|W(PA|NY|OH|WV)V)V)
Comme vous pouvez le voir, les expressions régulières ne sont pas conçues pour reconnaître les modèles de ce format. Cependant, si vous utilisez angulaire vous pouvez use a custom validator à la place. Considérez cette fonction qui prend une chaîne et renvoie true ou false selon qu'elle correspond au modèle:
function isValidDNASequence(input){
for(i=0, j=input.length-1; i<j; i++, j--){
if(!(
(input[i]==='P' && input[j]==='A') ||
(input[i]==='N' && input[j]==='Y') ||
(input[i]==='O' && input[j]==='H') ||
(input[i]==='W' && input[j]==='V')
) || i === j) return false;
}
return true;
}
Et où est votre code? –
Il n'est pas possible de vérifier ce genre de choses avec un motif regex en javascript. –
Une meilleure approche consiste à scinder la chaîne dans le milieu, puis on inverse et de traduire la deuxième partie (P => A, N => Y, O => H, W => V), puis de tester si les deux les parties sont égales ou non. –