逗号分隔的子串排列的正则表达式
您好,
我想定义一个正则表达式,它匹配由两个子字符串组成的字符串,这两个子字符串由一个逗号分隔。 每个子字符串可能不是空的,并且只包含字符而不重复字符' 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
提前致谢
罗伯特
答案 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