regex - 在 Perl 正则表达式中匹配捕获组的反向翻译

标签 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;
}

以这种方式将“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/

相关文章:

java - 在 repl.it 上反转 java 中的字符串

javascript - 如何检测 Snowflake VARCHAR 中的表情符号?

c# - 正则表达式不能按我的需要工作

windows - Strawberry Perl——默认情况下编码转换在哪里完成?

python - 在Python中反转数字列表的数字

java - 反向链表问题

C++ 正则表达式 : replace\d\s( with\d*(

regex - 从文本文件中提取电子邮件

perl - 构建本地 CPAN 存储库

Perl 脚本,使用 fork 还是线程?