2016-11-18 64 views
2

有人可以幫我用正則表達式來使用Validators.pattern()正則表達式的字符串組合和序列規則角2

我想對以下情形正則表達式: -

研究人員的DNA測序組需要存儲新發現的序列。設計一個系統,接受一個字符串,評估其有效性。有效的DNA對由PA,NY,OH,WV表示並封裝其他有效配對。序列可以是任意數量的對。

實施例有效對:

  • PNOWVHYA
  • NY
  • WOHV
  • PPAA

*〔實施例無效雙:

  • PAPA - 未封裝

  • NOH - N個

  • OONQHH不匹配對 - 無效字符Q

+0

你的代碼在哪裏? –

+0

在javascript中使用正則表達式模式來檢查這種事情是不可能的。 –

+0

更好的方法是在中間分割字符串,然後翻轉第二部分(P => A,N => Y,O => H,W => V),然後測試兩個字符串零件等於或不等於零。 –

回答

0

這是你將如何實現它的蟒蛇。您可以將相同的邏輯移植到任何其他編程語言。

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" 

輸出:

INVALID CODE 

你必須檢查4個條件:

  1. 如果代碼來測試信件是子集或等於集合到指定代碼 字母。
  2. 如果代碼是偶數字母。
  3. 如果連字母都加密。
  4. 如果加密的代碼是用有效代碼構造的。
0

您正在描述的字符串的類別稱爲Context Free Grammar,並且已知它在正常表達式可用於匹配的範圍之外。但是,如果將字符串限制爲特定長度,則可以使用正則表達式來匹配該長度內與該模式匹配的所有字符串。例如:

所有匹配的長度爲2或更小的圖案的字符串: (P(PA|NY|OH|WV)A|N(PA|NY|OH|WV)Y|O(PA|NY|OH|WV)H|W(PA|NY|OH|WV)V)

所有匹配的長度爲6的圖案串或: (PA|NY|OH|WV)

所有匹配的長度爲4或更小的圖案串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)

正如您所看到的,正則表達式並不旨在識別此格式的模式。但是,如果您正在使用角度,則可以改爲use a custom validator。考慮這個函數需要一個字符串,並根據它是否匹配模式返回true或false:

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