如何修复TeX字符串中不匹配的括号?

时间:2016-08-15 09:29:56

标签: regex perl text-processing

例如我有很多Tex字符串,如

|u(x,t)|^2 = \frac{1}{\sqrt{1+(4+t)^2))e^{-\frac{2(x-k_0t)^2}{1+4t^2))

上述Tex的问题是括号不匹配。 \frac{1}{\sqrt{1+(4+t)^2))应为\frac{1}{\sqrt{1+(4+t)^2}}{-\frac{2(x-k_0t)^2}{1+4t^2))应为{-\frac{2(x-k_0t)^2}{1+4t^2}}

wrong: \frac{1}{\sqrt{1+(4+t)^2))
right: \frac{1}{\sqrt{1+(4+t)^2}}

wrong: {-\frac{2(x-k_0t)^2}{1+4t^2))
right: {-\frac{2(x-k_0t)^2}{1+4t^2}}

说明:第一个示例不对,因为最后两个)没有)匹配它,它应该是}以匹配之前的{ }}

我想知道如何自动纠正这种不匹配的括号?我安装了perl,我打算用正则表达式做,但无法找到方法。

1 个答案:

答案 0 :(得分:1)

我不知道我是否理解正确,但听起来我需要计算括号并确保( or [ or {的数量等于相应的{{1}的数量}。

一种可能的解决方案是为TeX的每一行使用散列并在其中存储值(不确定文件的外观。我假设所有行都与您提供的一样):

) or ] or }

此代码至少会告诉您错误发生的位置,并让您大致了解这些错误的性质。对于诸如#!/usr/bin/perl use strict; use warnings; my $file = shift; my $line_num = 0; open FH, "<$file" or die "Error: $!\n"; while(<FH>) { my %brackets = ( '(' => 0, '[' => 0, '{' => 0 ); $line_num++; my @chars = split //, $_; ### Count brackets. foreach my $char (@chars) { if ($char eq '(' or $char eq '[' or $char eq '{') { $brackets{$char}++; } elsif ($char eq ')' or $char eq ']' or $char eq '}') { if ($char eq ')') { $brackets{'('}--; } if ($char eq ']') { $brackets{'['}--; } if ($char eq '}') { $brackets{'{'}--; } } else { next; } } ### Check that all hash values are 0. foreach my $bracket (keys %brackets) { if ($brackets{$bracket} != 0) { print "In line $line_num: '$bracket' missing $brackets{$bracket} closing brackets.\n"; } } } 之类的输入,输出将是:

)ff){gfs[[y[46rw]

您可以编写简单的代码来修复此问题,而不是打印括号(或存储括号的数量。可能更好地存储括号的索引),因为此时您将获得所需的所有信息。

如果文件中的错误没有模式,这不是一个简单的问题。我建议在实际尝试前寻找一个