在Perl正则表达式

时间:2018-04-19 08:45:40

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

添加&#39;反向&#39;是否正确?以这种方式运行到正则表达式的第三行:(??{ $2 =~ tr/ACGT/TGCA/r;reverse}))

如何匹配$ 2的reverse tr

1 个答案:

答案 0 :(得分:5)

您的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的返回值不会进入$_,因此; reverse会反转$_中的任何内容。这使整体比赛失败。

你实际上在最后一句话中回答了你自己的问题。

  

如何匹配$ 2的反向tr?

如果你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之后,它将完整的字符串作为匹配的第二部分。它正确地反转了字符串的左侧,但它返回了完整的字符串。

现在,如果我们将其与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"
...

它现在只返回字符串的音译左侧,然后匹配。