逗号分隔字符串的正则表达式

时间:2014-11-23 23:40:56

标签: regex string perl

逗号分隔的子串排列的正则表达式

您好,

我想定义一个正则表达式,它匹配由两个子字符串组成的字符串,这两个子字符串由一个逗号分隔。 每个子字符串可能不是空的,并且只包含字符而不重复字符' A' G'' C'和' T'。 因此,模式应匹配字符串,如:

A,G
AG,CT
TC,CA< - 正确,第一和第二子串可以具有共同的字符              (只要这些不在子串内重复) GAT,CGA
CGAT,TG< - 正确,子串可以具有不同的长度 等......

且不应匹配:

,G < - 缺少第一个子串
ACGT&lt; - 缺少逗号
X,A&lt; - 不正确的字符X
AA,G&lt; - 第一子串中字符A的重复
AC,GGC&lt; - 第二子串中字符G的重复
ATGA,TGG&lt; - 子串中的重复
ATCXG,AAC&lt; - 不正确的字符X和第二子串中的重复
等......

到目前为止,我有:

/^(?=[ACGT]{1,4},[ACGT]{1,4}$)(?!.*(.).*\1.*,)(?!,.*(.).*\1).*$/ 

/^(?=[ACGT]{1,4},[ACGT]{1,4}$)(?!.*(.).*\g{1}.*,)(?!,.*(.).*\g{1}).*$/ 

还尝试使用

加入捕获组
/^(?=[ACGT]{1,4},[ACGT]{1,4}$)(?!.*(.).*\g{1}.*,.*(.).*\g{2}).*$/

现在,(?=[ACGT]{1,4},[ACGT]{1,4}$)似乎匹配&#34;两个以单个逗号分隔的子字符串&#34;和&#34;完全由字符&#39; A&#39;&#39; G&#39;,&#39; C&#39;和&#39;&#39;&#34;通过弦; (?!.*(.).*\1.*,)似乎匹配&#34;没有重复&#34;直到逗号。

但是,(?!,.*(.).*\1)似乎没有确保它与逗号后的重复字符不匹配。

我非常感谢回复提供有助于进行所需匹配的线索和/或模式。

使用perl v5.18.2

提前致谢

罗伯特

2 个答案:

答案 0 :(得分:4)

将问题分解为步骤。

首先查找允许的格式和字符。然后检查以确保没有重复。

use strict;
use warnings;

while (<DATA>) {
    print if /^[ACGT]+,[ACGT]+$/ && !/(\w)\w*\1/;
}

__DATA__
A,G
AG,CT
TC,CA
GAT,CGA
CGAT,TG
,G
ACGT
X,A
AA,G
AC,GGC
ATGA,TGG
ATCXG,AAC

输出:

A,G
AG,CT
TC,CA
GAT,CGA
CGAT,TG

答案 1 :(得分:1)

我认为你非常接近。这也应该有效。
它基本上完成了@Miller的功能。

已更新 - 精简版。

 #  /(?m)^(?:(?:^|,)(?:([AGCT])(?![AGCT]*\1)){1,4}){2}$/

 (?m)                   # Multiline mode
 ^                      # BOL
 (?:                    # Total cluster
      (?: ^ | , )            # BOL or comma
      (?:                    # AGCT Cluster grp
           ( [AGCT] )             # (1), Capture single character [AGCT]
           (?!                    # Negative lookahead
                [AGCT]*                # As many [AGCT] needed
                \1                     # to find what is captured in group 1
           )                      # End Negative lookahead
      ){1,4}                 # End  AGCT Cluster grp 1-4 characters
 ){2}                   # Total cluster, do 2 times  
 $                      # EOL