我正在尝试查找与特定模式匹配的字符串,然后对该模式进行反向翻译,并用字母 O 分隔。
翻译规则为/ABC/XYZ。
匹配示例:CCBAOXYZZ
第一部分与模式 [ABC]{3,25} 匹配。然后还有一个字母 O
也匹配。然后我们看到 XYZZ 是 CCBA 的逆过程,应用了上面的翻译。
我已经成功地将 tr 规则写入我的反向引用中。但我也不知道如何做相反的事情。
while (my $input_string = <sample_input>) {
push @hit, $1 while $input_string
=~ m{
(([ABC]{3,25})
O
(??{ $2 =~ tr/ABC/XYZ/r}))
}xg;
}
以这种方式将“reverse”函数添加到正则表达式的第三行是否正确:(??{ $2 =~ tr/ACGT/TGCA/r;reverse}))
?
如何匹配 $2 的反向 tr
?
最佳答案
您的 tr///r
返回音译字符串。因此,您只需将 reverse
粘贴在 tr///r
前面即可。
push @hit, $1 while $input_string
=~ m{
(([ABC]{3,25})
O
(??{ reverse $2 =~ tr/ABC/XYZ/r }))
}xg;
tr///r
的返回值不会进入$_
,所以; verse
将反转 $_
中的内容。这使得整个匹配失败。
您实际上在最后一句话中回答了自己的问题。
<小时/>How do I do the match the reverse tr of $2?
如果您add use re 'debug'
您可以看到正在匹配的实际模式。
与 tr///;相反
,调试输出的第二部分,与从eval
编译的正则表达式相关,是:
...
Compiling REx "ZZYXOABCC"
Final program:
1: EXACT <ZZYXOABCC> (5)
5: END (0)
anchored "ZZYXOABCC" at 0 (checking anchored isall) minlen 9
Matching embedded REx "ZZYXOABCC" against "XYZZ"
...
正如我们在这里看到的,它将完整的字符串作为匹配的第二部分,位于O
之后。它正确地反转了字符串的左侧,但返回了完整的字符串。
现在,如果我们将其与反向 tr///r
进行比较,我们就会看到差异。
...
Compiling REx "XYZZ"
Final program:
1: EXACT <XYZZ> (3)
3: END (0)
anchored "XYZZ" at 0 (checking anchored isall) minlen 4
Matching embedded REx "XYZZ" against "XYZZ"
...
它现在只返回字符串的音译左侧,然后进行匹配。
关于regex - 在 Perl 正则表达式中匹配捕获组的反向翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49916611/