bav*_*owi 4 regex perl reverse tr
我试图找到匹配某个模式的字符串,然后是该模式的反向转换,然后用字母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;
}
Run Code Online (Sandbox Code Playgroud)
以这种方式将"反向"函数添加到正则表达式的第三行是否正确:(??{ $2 =~ tr/ACGT/TGCA/r;reverse}))?
我如何匹配reverse tr$ 2?
您tr///r 将返回音译字符串.所以你只需要坚持reverse在前面,tr///r你就会好起来.
push @hit, $1 while $input_string
=~ m{
(([ABC]{3,25})
O
(??{ reverse $2 =~ tr/ABC/XYZ/r }))
}xg;
Run Code Online (Sandbox Code Playgroud)
tr///r不会进入的返回值$_,因此; reverse会反转任何内容$_.这使得整体比赛失败.
你实际上在最后一句话中回答了你自己的问题.
如何匹配$ 2的反向tr?
如果添加,use re 'debug'您可以看到正在匹配的实际模式.
使用tr///; reverse,调试输出的第二部分,与从中编译的正则表达式相关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"
...
Run Code Online (Sandbox Code Playgroud)
正如我们在这里看到的那样,它将完整的字符串作为匹配的第二部分O.它正确地反转了字符串的左侧,但它返回了完整的字符串.
现在,如果我们将其与之进行比较reverse 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"
...
Run Code Online (Sandbox Code Playgroud)
它现在只返回字符串的音译左侧,然后匹配.