【发布时间】:2021-08-18 09:01:26
【问题描述】:
我已经用这个成功捕获了数据:
/^.{144}(.{15}).{34}(.{1})/
结果如下:
TTGGCCCCCACTCTC T
我想从相同的位置删除相同的字符。我尝试了一个简单的替换:
s/^.{144}(.{15}).{34}(.{1})//
这将删除所有描述的内容。如何仅删除 (...)?
【问题讨论】:
-
同时捕获其他部分,以便能够用您想要保留的部分替换整个匹配项:
s/^(.{144})(.{15})(.{34})(.)/$1$3/。或者,您可以“删除”第一个匹配项(使用\K),这样您就不必将其放回:s/^(.{144})\K(.{15})(.{34})(.)/$3/。如果您不需要要删除的东西(例如打印它们或存储在其他地方),则省略它们的捕获括号——它们不需要为了匹配,s/^.{144}\K.{15}(.{34})./$1/ -
仍然卡住。在执行任何一次传递之前,我需要确定要保留的组,在本例中为 $keep = "$1$3$5"。但是 s/.../$keep/ 导致整个记录被文字替换。数据、组等随着每次迭代而变化。我无法事先知道(将近一百万条记录)我需要什么。迷路了。
-
我不明白这个问题。因此,在您运行正则表达式(每个组都由
()捕获的版本)$v =~ s/.../.../;之后,您在$1中拥有 144 个字符,在$2中拥有接下来的 15 个字符(这已从$v中删除)然后$3中的 34 个字符,然后$4中的 1 个字符(从$v中删除)。然后,如果您需要其余部分并添加(.+),则位于$5(保留)中。你用你需要的东西去做,在下一次迭代中(我认为是某个循环),无论$var中的任何新内容都会重新发生......这个故事有什么问题? -
等等 --- 如果你的意思是你字面上写
$keep = '$1$2$3'然后在正则表达式中使用$keep(需要单引号)......不能那样做。是这个意思吗?