查找并正确替换LaTeX分数的数字

时间:2018-12-31 07:51:45

标签: regex perl replace substitution

我的Perl脚本接收数据并将其存储为数组。然后,脚本将这些数据转换为代码,然后将其复制到LaTeX中。

我的部分数据包括4.25、6.5、6.75之类的数字,我希望进行查找和替换,以便在粘贴到LaTeX中时将4.25写为4 1/4。要求用户提供存储为$variable的号码。查找和替换操作如下:

$variable =~ s/\b.25\b/\\sfrac{1}{4}/;
$variable =~ s/\b.5\b/\\sfrac{1}{2}/;
$variable =~ s/\b.75\b/\\sfrac{3}{4}/;                  

我想要做的是将4.25替换为代码4\sfrac{1}{4},将6.5替换为代码6\sfrac{1}{2},将6.75替换为代码{ {1}}。

但是,运行此命令时,它将正确替换.25和.5,但是将.75替换为6\sfrac{3}{4}。我对它在做什么感到困惑。

我确实将代码更改为:

.\sfrac{1}{2}

这可以缓解上述问题,但是当我输入数字5.5时,它将替换为$variable =~ s/\b.25\b/\\sfrac{1}{4}/; $variable =~ s/\b.75\b/\\sfrac{3}{4}/; $variable =~ s/\b.5\b/\\sfrac{1}{2}/; 而不是\sfrac{1}{2}.5

此外,如果我需要将5\sfrac{1}{2}转换为字符串,该怎么做?

2 个答案:

答案 0 :(得分:3)

未转义的点匹配任何字符(换行符除外)。要匹配正则表达式中的文字点,您需要\.[.]

例如,\b.5\b75中的0.75相匹配,因为点可以与7相匹配。

答案 1 :(得分:1)

顺便说一句,您不应像这样多次扫描输入。这是一个更好的解决方案:

my %map = (
   ".25" => "\\sfrac{1}{4}",
   ".5"  => "\\sfrac{1}{2}",
   ".75" => "\\sfrac{3}{4}",
);

my $alt = join "|", map quotemeta, keys %map;    
my $re = qr/\b($alt)\b/;

$var =~ s/$re/$map{$1}/g;