gpt4 book ai didi

regex - 你能解释为什么我的 Perl 正则表达式模式中的\G 会这样吗?

转载 作者:行者123 更新时间:2023-12-04 18:09:27 27 4
gpt4 key购买 nike

$dna = "ATCGTTGAATGCAAATGACATGAC";
while ($dna =~ /(\w\w\w)*?TGA/g) { # note the minimal *?
print "Got a TGA stop codon at position ", pos $dna, "\n";
}

答案是:
Got a TGA stop codon at position 18    Got a TGA stop codon at position 23

Why is the position 18, but not 8? And the following 23. I'm confused how does it match? What's the detail information about the match?

But the right code is:

while ($dna =~ /\G(\w\w\w)*?TGA/g) {        
print "Got a TGA stop codon at position ", pos $dna, "\n";
}

这打印:

在 18 位有一个 TGA 终止密码子

如何?

最佳答案

正如@Tomalak 所说,您不需要 *?因为这是造成您情况困惑的原因。这是您的第一段代码中发生的事情:

它看到(\w\w\w)*?不情愿(可选)所以它跳过它并尝试匹配 TGA但没有运气,所以引擎回溯并匹配三个连续的单词字符阅读 ATC ,现在它再次尝试匹配 TGA但又没有运气,所以它又连续读了三个 \w并且引擎已读取 ATCGTT迄今为止。

现在它尝试 TGA再次失败,然后回溯并读取 \w\w\w再次,现在它有 ATCGTTGAA ,现在试图找到 TGA但是读到最后三个时已经跳过了第一个 \w ,所以这就是引擎找不到第一个 TGA 的原因因此未能报告其位置。

现在引擎继续处理这件事,直到找到 TGA三后AAA (如果你像我一样继续前进,你会看到这是如何发生的),现在它执行循环打印 18 中的指令。

由于您使用过 /g修饰符,下一次匹配尝试从第一个匹配失败的地方开始,然后尝试另一个匹配,在最后一个匹配之后跳过一个字符,依此类推,直到匹配最后一个 TGA并打印 23。

那么为什么在第二种情况下它只匹配 18 个位置,使用 \G 的效果是什么?修饰符?

好吧,一切都一样,直到在三个 AAA 之后找到第一个匹配项,就像之前的情况一样。 ,然后当下一场比赛开始时,它会尝试匹配 \G这意味着尝试匹配最后一场比赛在 AAATGA 之后结束的地方并且它起作用了,然后它尝试匹配字符串的其余部分但失败了,但是这次当引擎尝试跳过单个字符或两个或三个左右时,它将始终尝试匹配 \G第一个不会发生,除非匹配在前一个末尾(即在 AAATGA 之后)开始,所以它会一直失败,因此只报告 18 处的单个匹配位置。

只需删除 *?正如@Tomalak 所说。

关于regex - 你能解释为什么我的 Perl 正则表达式模式中的\G 会这样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18310662/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com