【问题标题】:Regular expression for a comma separated string逗号分隔字符串的正则表达式
【发布时间】:2014-11-23 23:40:55
【问题描述】:

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

嗨,

我想定义一个正则表达式来匹配由单个逗号分隔的两个子字符串组成的字符串。 每个子字符串不能为空,并且仅由字符“A”、“G”、“C”和“T”组成且不重复。 因此,模式应该匹配字符串,例如:

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

并且不应该匹配:

,G ACGT X,A AA,G AC,GGC ATGA,TGG ATCXG,AAC 等等...

到目前为止我有:

/^(?=[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}$) 似乎与整个字符串中的“由单个逗号分隔的两个子字符串”和“仅由字符 'A'、'G'、'C' 和 'T' 组成”相匹配; (?!.*(.).*\1.*,) 似乎匹配“不重复”直到逗号。

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

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

使用 perl v5.18.2

提前致谢

罗伯特

【问题讨论】:

  • 这给了我一些有趣的尝试使用命名捕获组。谢谢,罗伯特!我希望我们的答案之一对您的设置很有效 :) StackOverflow 是获得 Regex 帮助和建议的好地方!请问这需要什么样的功能?我想知道这种模式识别可以用于什么上下文。

标签: regex string perl


【解决方案1】:

把你的问题分解成几个步骤。

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

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

【讨论】:

  • 非常整洁。但我很同情正则表达式引擎!
【解决方案2】:

我认为你很接近。这也应该有效。
它基本上做了@Miller's 所做的事情。

更新 - 精简版。

 #  /(?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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2016-12-03
    相关资源
    最近更新 更多