我应该如何结合这些正则表达式?

Ori*_*ion 5 regex perl

 $syb =~ s/(at{3,6})/\U$1/gi;

 $syb =~ s/(aat{2,5})/\U$1/gi;

 $syb =~ s/(aaat{1,4})/\U$1/gi;

 $syb =~ s/(aaaat{0,3})/\U$1/gi;

 $syb =~ s/(aaaaat{0,2})/\U$1/gi;

 $syb =~ s/(a{4,7})/\U$1/gi;

 $syb =~ s/(aaaaaat)/\U$1/gi;

 $syb =~ s/(t{4,7})/\U$1/gi;
Run Code Online (Sandbox Code Playgroud)

有什么方法可以将所有这些正则表达式合二为一吗?在同一个字符串上使用这么多正则表达式是不好的做法吗?最终的结果应该是$ syb是aaatcgacgatcgatcaatttcgaaaaaggattttttatgcacgcacggggattaaaa regexp应该成功的 AAATcgacgatcgatcAATTTcgAAAAAggATTTTTTatgcacgcacggggattAAAA

我的正则表达式的一个问题是它们匹配aaaatttt为两个单独的匹配和输出AAAATTTT.我也需要解决这个问题.

我有一串A的C's T和G存储在$ syb中.我想把字符串的任何部分大写,其中包含一组A,然后是T,只有A或只是T(T后跟A不应该),大写部分可能不短于4且不长于7

Jac*_*ers 5

这是困难的一个.我认为这可能有效:

s/((?<!a)a|(?<!a|t)t)((?<!t)\1|t){3,6}(?!\2|t)/\U$&/gi
Run Code Online (Sandbox Code Playgroud)

基本上,我正在做的是:

  1. 得到一个a没有先前的a.或者t之前没有at.
    • ((?<!a)a|(?<!a|t)t)
  2. 获得3-6个第一场比赛,或者t's之前没有t
    • ((?<!t)\1|t){3,6}
  3. 确保序列中的最后一项或a后面没有t.
    • (?!\2|t)/

和perl代码:

$syb = "aaatcgacgatcgatcaatttcgaaaaaggattttttatgcacgcacggggattaaaaactgaaaattttactgaaaaaaaasttttttts";
$syb =~ s/((?<!a)a|(?<!a|t)t)((?<!t)\1|t){3,6}(?!\2|t)/\U$&/gi;
print $syb;
Run Code Online (Sandbox Code Playgroud)

编辑从qtax队列我从我的队列中删除了捕获组并从他的角色中删除:

s/(?:(?<!a)a|(?<!a|t)t)(?:(?<!t)a|t){3,6}(?!(?<=a)a|t)/\U$&/gi
Run Code Online (Sandbox Code Playgroud)

编辑:将正则表达式减少5个字符.

s/(?<!a|t(?=t))(?:a|t(?!a)){3,6}(?:a(?!a)|t)(?!t)/\U$&/gi
Run Code Online (Sandbox Code Playgroud)

与交易

s/
# Look behind for a char not an 'a' nor a 't' followed by a 't'
(?<!a|t(?=t))
# Capture 3-6 'a's or 't's not followed by 'a's
(?:a|t(?!a)){3,6}
# Capture an 'a' not followed by an 'a', or a 't'
(?:a(?!a)|t)
#make sure none of this is followed by a 't'.
(?!t)
/\U$&/gix;
Run Code Online (Sandbox Code Playgroud)