主要原理就是将(可能)标志着 1/2 序号的字符替换成相同的字符,然后比较修改后的字符串是否相同,相同的字符串对应的原始路径被分到同一组。
理想情况下,每组应该只有一个路径(单端测序)或者两个路径(双端测序),如果出现三个及以上的情况,需要检查对应路径名称,修改文件名称或者匹配规则。
这里使用了 位置匹配 的负向断言功能((?!)
):只尝试替换前后都不是数字的 1/2,避免误伤其他序号类数值。
虽然这样还是存在漏洞,例如下面的例子:
- test-1-1.fq.gz
- test-1-2.fq.gz
- test-2-1.fq.gz
- test-2-2.fq.gz
function groupFastaPaths(strings: string[]): string[][] {
const groups: { [key: string]: string[] } = {}
for (let i = 0; i < strings.length; i++) {
const str = strings[i]
const key = str.replace(/(?!\d)[12](?!\d)/g, '@')
if (!groups[key]) {
groups[key] = [str]
} else {
groups[key].push(str)
}
}
return Object.values(groups)
}
评论区