字符串组合和序列规则的正则表达式2

时间:2016-11-18 01:05:13

标签: javascript regex angular regular-language

有人可以帮助我在 Validators.pattern()中使用正则表达式吗?

我想要一个针对以下场景的正则表达式: -

DNA测序组的研究人员需要存储新发现的序列。设计一个接受字符串的系统,评估其有效性。有效的DNA对由 PA,NY,OH,WV 表示,并封装其他有效对。序列可以是任意数量的对。

示例有效对:

  • PNOWVHYA
  • NY
  • WOHV
  • PPAA

* Exmaple无效对:

  • PAPA - 未封装

  • NOH - N

  • 上没有匹配对
  • OONQHH - 无效字符Q

2 个答案:

答案 0 :(得分:0)

这是你在python中实现它的方法。您可以将相同的逻辑移植到任何其他编程语言。

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. 如果加密代码是使用有效代码构建的。

答案 1 :(得分:0)

您描述的字符串类别称为Context Free Grammar,并且已知在正则表达式可用于匹配的范围之外。但是,如果将字符串限制为特定长度,则可以使用正则表达式,以便在该长度内匹配该模式的所有字符串。例如:

所有与长度为2或更短的模式匹配的字符串: (PA|NY|OH|WV)

所有符合长度为4或更短的模式的字符串: (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或更短的模式的字符串: (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;
}