例如我有很多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,我打算用正则表达式做,但无法找到方法。
答案 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]
您可以编写简单的代码来修复此问题,而不是打印括号(或存储括号的数量。可能更好地存储括号的索引),因为此时您将获得所需的所有信息。
如果文件中的错误没有模式,这不是一个简单的问题。我建议在实际尝试前寻找一个