查找和替换并获取替换内容值的计数

时间:2018-08-10 13:57:18

标签: regex perl

我需要使用正则表达式已知或未知模式查找和替换内容,然后我们需要存储查找内容,替换内容,替换内容计数:(我需要从100多个替换内容中获取该内容)

  

在这里我们需要获得

1)查找内容
2)已替换的内容和
3)计数值

  

示例:<查找> <替换>->计数

此外,我们无法假设这一点,这可能是我们正在寻找和替换的,我们应该获得此报告。

我尽力了:

use strict;
use warnings;

my $str = 'Trp $\mathbf{R}^a$ locates \alpha \beta distantly $\mathrm{R}^a$ from $\mathit{R}^a$ cys25 in both \gamma and cathepsin K, with \alpha high and moderate $\mathbb{R}^1H$ strengths, respectively. The protein $\mathds{R}^a$ modification $\mathds{R}^1H$ largely \beta affects the binding sites and stability \gamma of the \gamma peptides, and the effects depend on \alpha the elemental compositions of the peptides';

#Sample :
$str=~s{<findcontent>}{<replacedcontent>}g;


#Tried something *different*
my $cnt=0; my (@pushStatsreport,$Statsreport) = "";

$str=~s/\\alpha/my $find=$&; my $rep = "\\boldsymbol\{\\alpha\}"; $cnt++; $Statsreport = "Find: $find\tRep: $rep\tCnt: $cnt\n"; ($rep); /ge;
push(@pushStatsreport, $Statsreport); $cnt=0;

$str=~s/\\math(it|rm|bf)\s*([a-z])\b/my $find = $&; my $rep = "\\checkmath$1\{$2\}"; $cnt++; $Statsreport = "Find: $find\tRep: $rep\tCnt: $cnt\n"; ($rep); /ge;
push(@pushStatsreport, $Statsreport);

print join "\n", @pushStatsreport;

我的结果和期望的输出:

  

查找:\ alpha Rep:\ boldsymbol {\ alpha} Cnt:3
  找到:\ mathbf a代表:\ checkmathbf {a} Cnt:2

但是我不能接受这是更好的方法。有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

您可以尝试将搜索和替换字符串放入数组数组中,然后进行迭代以进行替换并收集计数和报告:

my @findreplace = (
    [ q<\\\\alpha>, q<\boldsymbol{\alpha}>],
    [ q<\\\\math(it|rm|bf)\s*([a-z])\b>, q<\checkmath$1{$2}>],
);

my (@pushStatsreport, $Statsreport);
for my $item (@findreplace) {
    my ( $regex, $replace ) = @$item;
    my $cnt = $str =~ s{$regex}{'"$replace"'}eeg;
    $Statsreport = "Find: $regex\tRep: $replace\tCnt: $cnt";
    push @pushStatsreport, $Statsreport;
}