2017-08-06 46 views
2

我有* TEX文件包含:列表需要检查每一个在一个字符串

__DATA__ 
"\left({H^1}, \int {H^2}\right)" 
"\left({H^1},\bigoplus{H^2}\right)" 
"\left({H^1},{H^2}\right)" 
"\left({H^1}, \bigvee {H^2}\right)" 

上面* TEX内容我要检查我所下面列出的数组元素的列表:如果任何一个元素匹配,然后保留该行:如果没有一个元素匹配,那么我需要将\left(替换为(\right),并将其替换为)

我的数组:

int frac prod sum oint bigvee bigcup bigcap bigoplus bigotimes 

预期输出:

"\left({H^1}, \int {H^2}\right)" 
"\left({H^1},\bigoplus{H^2}\right)" 
"({H^1},{H^2})" 
"\left({H^1}, \bigvee {H^2}\right)" 

我曾尝试:

my @mathenv = qw(int frac prod sum oint bigvee bigcup bigcap bigoplus bigotimes); 

while(<DATA>) { $mathchk .= $_; } 

$boolChk = 'False'; 
$mathchk=~s#\\left\(((?:(?!\\(?:left|right)).)*)\\right\)# my $fulcnt=$&; my $Content=$1; 
foreach my $singlemath(@mathenv) 
{ 
    \#print "S: -$singlemath-\n"; 
    if($fulcnt=~m/\\$singlemath/gi) 
    { $boolChk = 'True'; } 
} 
print ": $boolChk \t$fulcnt\n"; system 'pause'; 
if($boolChk eq 'True') { } 
if($boolChk eq 'False') { $fulcnt = "\($Content\)"; } 
($fulcnt); 
#esg; 

#print $mathchk; 

__DATA__ 
"\left({H^1}, \int {H^2}\right)" 
"\left({H^1},\bigoplus{H^2}\right)" 
"\left({H^1},{H^2}\right)" 
"\left({H^1}, \bigvee {H^2}\right)" 

我能不能够得到正确的输出,因此,如果有人指导我在哪里我必须修改上面的代码。提前致谢。

回答

2

对于所示的数据

use warnings; 
use strict; 

use List::Util qw(none); 

my @terms = qw(int frac prod sum oint bigvee bigcup bigcap bigoplus bigotimes); 

my ($paren_L, $paren_R) = map { quotemeta $_ } '\left(', '\right)'; 

while (my $line = <DATA>) 
{ 
    if (none { $line =~ /$_/ } @terms) 
    { 
     $line =~ s|$paren_L|(|; 
     $line =~ s|$paren_R|)|; 
    } 
    print $line; 
} 

__DATA__ 
"\left({H^1}, \int {H^2}\right)" 
"\left({H^1},\bigoplus{H^2}\right)" 
"\left({H^1},{H^2}\right)" 
"\left({H^1}, \bigvee {H^2}\right)" 

与输出

 
"\left({H^1}, \int {H^2}\right)" 
"\left({H^1},\bigoplus{H^2}\right)" 
"({H^1},{H^2})" 
"\left({H^1}, \bigvee {H^2}\right)" 

注记。

  • 这并不说明多重括号表达式在一行

  • 有(许多)其他方式,乳胶指定括号(​​,\Bigg(等)。

另一方面,在Latex文档中显示的数据是合理的。

这多次超过线路,但比单个正则表达式更灵活。


有了这样简单的模式,我们不必启动正则表达式引擎每个术语,而是可以构建具有交替一个模式。取代也可被在一个传完成,使用named capture groups

my $re_terms = '(?:' . join('|', @terms) . ')'; 

while (my $line = <DATA>) 
{ 
    if ($line !~ /$re_terms/) 
    { 
     $line =~ s/(?<L>$paren_L)|(?<R>$paren_R)/$+{L} ? '(' : ')'/eg; 
    } 
    print $line; 
} 

产生相同的输出。

这确实需要以显示的格式显示数据:parens始终配对,一个设置在一行上。

相关问题