大小等于前一个块的正则表达式搜索块

Regex search block with size equal to previous block

我想用正则表达式逐块解析 FASTQ 文件。 FASTQ 文件如下所示:

@EAS54_6_R1_2_1_413_324     // seqname
CCCTTCTTGTCTTCAGCGTTTCTCC   // seq
+                           // seqname #2
;;3;;;;;;;;;;;;7;;;;;;;88   // qual
@EAS54_6_R1_2_1_540_792     // seqname
TTGGCAGGCCAAGGCCGATGGATCA   // seq
+                           // seqname #2
;;;;;;;;;;;7;;;;;-;;;3;83   // qual
@EAS54_6_R1_2_1_443_348     // seqname
GTTGCTTCTGGCGTGGGTGGGGGGG   // seq
+EAS54_6_R1_2_1_443_348     // seqname #2
;;;;;;;;;;;9;7;;.7;393333   // qual

其格式:

<fastq>     :=  <block>+
<block>     :=  @<seqname>\n<seq>\n+[<seqname>]\n<qual>\n
<seqname>   :=  [A-Za-z0-9_.:-]+
<seq>       :=  [A-Za-z\n\.~]+
<qual>      :=  [!-~\n]+

问题是我无法检测到块的结尾(或下一个块的开始),因为 @ 也在 <qual> 块中使用。但是 <qual> 块必须与 <seq> 块大小相同。

问题:是否可以编写一个组大小限制为另一个组大小的正则表达式?

喜欢这个(\2.size令牌除外):

(?:@([A-Za-z0-9_\.:-]+)\n([A-Za-z\n\.~]+)\n\+([A-Za-z0-9_.:-]*)\n([!-~\n]{.size}))*
    ^.....seqname.....^  ^.....seq......^    ^....seqname2....^  ^qual(should be same size as seq)^

更新:我们无法搜索 @ 代币,因为它可以出现在 <qual> 区块

这是解析它的正则表达式:

(.*?(?=\n@[A-Z]|$)) //single-line,global

通过 (?=\n@[A-Z]|$) 前瞻,我们强制 .*? 获取所有内容直到 就在 以 '@' 开头的新行之前后跟一个(大写)字母,或输入结束

demo

遗憾的是,无法将 a{n}b{n} 与正则表达式匹配。它需要上下文无关的语法; here's a proof.

(相反,只需匹配 name、seq 和 +,然后获取 seq 匹配的 match.size(),然后从剩余字符串中读取接下来的 n 个字符以获得 qual。)