如何将REGEX替换为从* INI文件获取的普通文本

时间:2017-09-28 07:47:14

标签: regex perl

我有一个包含setInterval()

的文本文件
Text.txt

我有\mathbf{\mathit{adad09} \mathit{\mathit{aavB} \mathul{\mathit{AZDs} 个文件包含(因为用户可以添加或减少替换

test.ini

我的预期输出是

<repl>
\mathbf{\mathit{([A-z0-9]*)}    \boldsymbol{\mathit{$1}
\mathit{\mathit{([A-z0-9]*)}    \italicsymbol{\mathit{$1}
\mathul{\mathit{([A-z0-9]*)}    \underlinesymbol{\mathit{$1}
</repl>

我的编码在这里

\boldsymbol{\mathit{adad09}
\italicsymbol{\mathit{aavB}
\underlinesymbol{\mathit{AZDs}

错误:

use strict;
use warnings;
use Cwd;

my $myinicnt = ""; my $file = "Test.txt"; my $str = "";
readFileinString($file, \$str); readFileinString("Test.ini", \$myinicnt);
my @replsEach = ();

if($myinicnt=~m/<repl>(.*?)<\/repl>/gs) {  @replsEach = split /\n/, $1;  }
foreach my $myvar( @replsEach )
{
    my ($val1, $val2) = split /\t/, $myvar;
    my $quval1 = quotemeta $val1;

    #First Attempt
    $str=~s{$val1}{$val2}gi;

    #Second Attempt 
    $str=~s{$quval1}{$val2}gi;
}

print $str;

#---------------> File reading
sub readFileinString
#--------------->
{
    my $File = shift;
    my $string = shift;
    open(FILE1, "<$File") or die "\nFailed Reading File: [$File]\n\tReason: $!";
    read(FILE1, $$string, -s $File, 0);
    close(FILE1);
}

#---------------> File Writing
sub writeFileinString
#--------------->
{
    my $File = shift;
    my $string = shift;
    my @cDir = split(/\\/, $File);
    my $tmp = "";
    for(my $i = 0; $i < $#cDir; $i++)
    {
        $tmp = $tmp . "$cDir[$i]\\";
        mkdir "$tmp";
    }
    if(-f $File){
        unlink($File);
    }
    open(FILE, ">$File") or die "\n\nFailed File Open for Writing: [$File]\n\nReason: $!\n";
    print FILE $$string;
    close(FILE);
}
#------------------------- SUB END ------------------------->

请任何人都可以指导我获得解决方案。

1 个答案:

答案 0 :(得分:2)

如果您打印$ quval1,您将看到问题所在:

\\mathbf\{\\mathit\{\(\[A\-z0\-9\]\*\)\}
                    ~~~~ ~~  ~~ ~~~~~~

http://allenfang.github.io/react-bootstrap-table/index.html反斜杠,圆括号,方括号和星号,但你需要保持它们不被反击。

但是,您如何识别哪些字符是正则表达式的一部分,哪些是TeX标记的一部分?

将正则表达式存储在已引用的文件中。

但是,这并没有结束这个故事。 $1是替换未扩展,因为它不包含在替换字面上。您可以使用/e开关来评估替换,但是您需要再次使用反斜杠反斜杠,事实上您需要使用双/ee来正确评估代码,因此您需要包装引号中的字符串使其在语法上正确。

数据:

<repl>
\\mathbf\{\\mathit\{([a-zA-Z0-9]*)\}    \\boldsymbol{\\mathit{$1}
\\mathit\{\\mathit\{([a-zA-Z0-9]*)\}    \\italicsymbol{\\mathit{$1}
\\mathul\{\\mathit\{([a-zA-Z0-9]*)\}    \\underlinesymbol{\\mathit{$1}
</repl>

代码:

$val2 = qq("$val2");
$str =~ s/$val1/$val2/geei;

我还必须修复文件名,因为TextTesttest是三个不同的字符串。