2016-11-18 5 views
2

Quelqu'un peut-il m'aider avec l'expression régulière à utiliser dans Validators.pattern()?regex pour la combinaison de chaînes et les règles de séquence angulaire 2

Je veux un regex pour le scénario suivant: -

Les chercheurs d'un groupe de séquençage de l'ADN ont besoin de stocker des séquences nouvellement trouvées. Concevoir un système qui acceptera une chaîne, évaluer sa validité. Des paires d'ADN valides sont représentées par PA, NY, OH, WV et encapsulent d'autres paires valides. Une séquence peut être n'importe quel nombre de paires.

Exemple paires valides:

  • PNOWVHYA
  • NY
  • WOHV
  • ppaa

* exmaple paires non valides:

  • PAPA - pas encapsulant

  • NOH - pas de paire correspondant sur N

  • OONQHH - caractère invalide Q

+0

Et où est votre code? –

+0

Il n'est pas possible de vérifier ce genre de choses avec un motif regex en javascript. –

+0

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. –

Répondre

0

Voici comment vous le mettre en œuvre en python. Vous pouvez porter la même logique vers n'importe quel autre langage de programmation.

from collections import Counter 

code_to_test = 'OONQHH' 
valid_codes=['PA','NY','OH','WV'] 
valid_code_letters=['P','A','N','Y','O','H','W','V'] 
w,x,y = False,False,False 

#test condition 1 
alpha=list(code_to_test) 
if set(alpha) <= set(valid_code_letters): 
    w=True 

#test condition 2,3 
if len(code_to_test)%2==0: 
    if len(code_to_test)==2: 
     if code_to_test in valid_codes: 
      x=True 
    else: 
     a = [code_to_test[i:i+2] for i in range(0, len(code_to_test), 2)] 
     for q in a: 
      if q in valid_codes: 
       break 
     else: 
      x=True 

#test condition 4 
ccount = Counter(code_to_test) 
if ccount['P']==ccount['A'] and ccount['N']==ccount['Y'] and ccount['O']==ccount['H'] and ccount['W']==ccount['V']: 
    y=True 

if w and x and y: 
    print "VALID CODE" 
else: 
    print "INVALID CODE" 

Sortie:

INVALID CODE 

Vous devez vérifier 4 conditions:

  1. Si les lettres de code pour tester est sous-ensemble ou égal reprogramme donné lettres.
  2. Si le code est pair.
  3. Si même des lettres alors, est-il crypté.
  4. Si le code crypté est construit avec des codes valides.
0

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; 
}