加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

匹配Perl正则表达式中捕获组的反向转换

发布时间:2020-12-16 06:21:36 所属栏目:大数据 来源:网络整理
导读:我试图找到匹配某个模式的字符串,然后是该模式的反向转换,然后用字母O分隔. 翻译规则是/ ABC / XYZ. 匹配示例:CCBAOXYZZ 第一部分匹配模式[ABC] {3,25}.然后有一个字母O也匹配.然后我们看到XYZZ与CCBA相反,并且应用了上述转换. 我设法将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;
}

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

我如何匹配$2的反向tr?

解决方法

你的tr /// r返回音译字符串.所以你只需要在tr /// r前面坚持反向,你就可以了.

push @hit,$1 while $input_string
    =~ m{
      (([ABC]{3,25})
      O
      (??{ reverse $2 =~ tr/ABC/XYZ/r }))
    }xg;

tr /// r的返回值不会进入$_,所以;反向将反转$_中的任何内容.这使得整体比赛失败.

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

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"
...

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读