在 Perl 正则表达式中匹配捕获组的反向翻译
Match reverse translation of a capture group in Perl regex
我试图找到匹配特定模式的字符串,然后对该模式进行反向翻译,然后用字母 O 分隔。
翻译规则是/ABC/XYZ.
匹配示例:CCBAOXYZZ
第一部分匹配模式 [ABC]{3,25}。然后有一个字母 O
也匹配。然后我们看到 XYZZ 是 CCBA 的反向应用上面的翻译。
我已经设法将 tr 规则写入我的反向引用中。但我也不知道如何做相反的事情。
while (my $input_string = <sample_input>) {
push @hit, while $input_string
=~ m{
(([ABC]{3,25})
O
(??{ =~ tr/ABC/XYZ/r}))
}xg;
}
在regex的第三行添加'reverse'函数是否正确:(??{ =~ tr/ACGT/TGCA/r;reverse}))
?
如何匹配 $2 的 reverse tr
?
你的tr///r
returns音译字符串。所以你只需要把你的 reverse
放在 tr///r
前面就可以了。
push @hit, while $input_string
=~ m{
(([ABC]{3,25})
O
(??{ reverse =~ tr/ABC/XYZ/r }))
}xg;
tr///r
的 return 值不会进入 $_
,因此 ; reverse
将反转 $_
中的任何内容。这使得整体匹配失败。
您实际上在最后一句话中回答了您自己的问题。
How do I do the match the reverse tr of ?
如果您 add 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"
...
正如我们在这里看到的,它将整个字符串作为匹配的第二部分,在 O
之后。它正确地反转了字符串的左侧,但它 return 编辑了整个字符串。
现在,如果我们将其与 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"
...
它现在只有 return 字符串的音译左侧,然后匹配。
我试图找到匹配特定模式的字符串,然后对该模式进行反向翻译,然后用字母 O 分隔。
翻译规则是/ABC/XYZ.
匹配示例:CCBAOXYZZ
第一部分匹配模式 [ABC]{3,25}。然后有一个字母 O
也匹配。然后我们看到 XYZZ 是 CCBA 的反向应用上面的翻译。
我已经设法将 tr 规则写入我的反向引用中。但我也不知道如何做相反的事情。
while (my $input_string = <sample_input>) {
push @hit, while $input_string
=~ m{
(([ABC]{3,25})
O
(??{ =~ tr/ABC/XYZ/r}))
}xg;
}
在regex的第三行添加'reverse'函数是否正确:(??{ =~ tr/ACGT/TGCA/r;reverse}))
?
如何匹配 $2 的 reverse tr
?
你的tr///r
returns音译字符串。所以你只需要把你的 reverse
放在 tr///r
前面就可以了。
push @hit, while $input_string
=~ m{
(([ABC]{3,25})
O
(??{ reverse =~ tr/ABC/XYZ/r }))
}xg;
tr///r
的 return 值不会进入 $_
,因此 ; reverse
将反转 $_
中的任何内容。这使得整体匹配失败。
您实际上在最后一句话中回答了您自己的问题。
How do I do the match the reverse tr of ?
如果您 add 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"
...
正如我们在这里看到的,它将整个字符串作为匹配的第二部分,在 O
之后。它正确地反转了字符串的左侧,但它 return 编辑了整个字符串。
现在,如果我们将其与 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"
...
它现在只有 return 字符串的音译左侧,然后匹配。