【问题标题】:regex for string combination and sequence rules angular 2字符串组合和序列规则的正则表达式 angular 2
【发布时间】:2017-04-01 18:07:10
【问题描述】:

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

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

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

有效对示例:

  • PNOWVHYA
  • 纽约
  • WOHV
  • PPAA

*示例无效对:

  • PAPA - 未封装

  • NOH - N 上没有匹配对

  • OONQHH - 无效字符 Q

【问题讨论】:

  • 你的代码在哪里?
  • 无法在 javascript 中使用正则表达式模式检查这类事情。
  • 更好的方法是将字符串从中间拆分,然后反转并翻译第二部分(P=>A,N=>Y,O=>H,W=>V),然后你测试这两个部分是否相等。
  • 用正则表达式实现这个有点疯狂。但如果你能以某种方式用正则表达式解决它,那么请发布解决方案。

标签: javascript regex angular regular-language


【解决方案1】:

这就是你在 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. 如果加密代码是由有效代码构成的。

【讨论】:

    【解决方案2】:

    您所描述的字符串类别称为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)

    如您所见,正则表达式并非旨在识别这种格式的模式。但是,如果您使用 Angular,则可以 use a custom validator 代替。考虑这个函数,它接受一个字符串并根据它是否匹配模式返回真或假:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      相关资源
      最近更新 更多