为什么 Text::Balanced::extract_bracketed 不提取 LaTeX 标签中的文本?



我正在尝试使用来自Text::Balanced的extract_bracketed解析平衡文本(实际上是用LaTeX编写的文本)。但是,我没有获得与以下代码的正确匹配:

use Text::Balanced qw(extract_bracketed);
my $data = 'xxx footnote{...} yyy';
(my $ext, my $rem, my $pre) = extract_bracketed($data, '{}', 'footnote');
print "$ext = $extn";
print "$rem = $remn";
print "$pre = $pren";

这将打印:

$ext =                                                                                                                  
$rem = xxx footnote{...} yyy                                                                                           
$pre =

根据文档,此输出意味着发生了故障,但我不明白为什么。

我真正想要提取的是...,即footnote命令的内容。

为什么会发生这种情况,我该如何解决?

文本::平衡设置失败时$@,以便您可以获取有关原因的详细信息:

use strict;
use warnings 'all';
use 5.010;
use Text::Balanced qw(extract_bracketed);
my $text = 'xxx footnote{...} yyy';
my ($substring, $remainder, $prefix) = extract_bracketed($text, '{}', 'footnote');
warn $@ if $@;

输出:

Did not find prefix: /footnote/, detected at offset 0 at balanced line 12.

前缀不匹配,因为:

  • 它必须从字符串的开头一直匹配到分隔符的第一个匹配

  • f匹配表单馈送,而不是文字反斜杠后跟字母 f

以下前缀匹配第一个大括号的所有内容:

use strict;
use warnings 'all';
use 5.010;
use Text::Balanced qw(extract_bracketed);
my $text = 'xxx footnote{...} yyy';
my ($substring, $remainder, $prefix) = extract_bracketed($text, '{}', '[^{}]*');
say "<$_>" for $prefix, $substring, $remainder;

输出:

<xxx footnote>
<{...}>
< yyy>

要从文本中实际删除嵌套的脚注标签,保留其内容,您需要使用 extract_tagged

use strict;
use warnings 'all';
use 5.010;
use Text::Balanced qw(extract_tagged);
my $text = 'footnote{abc footnote{...} def emph{!!!} ghi}';
my @pieces = extract_tagged(
    $text, 
    '\footnote{', 
    '}', 
    '(?s).*\footnote{.*(?=\footnote{)'
);
my ($remainder, $prefix, $contents) = @pieces[1, 2, 4];
say $prefix . $contents . $remainder;

输出:

footnote{abc ... def emph{!!!} ghi}

请注意,此方法适用于您给出的简单输入,但不能用作通用 LaTeX 解析器。CPAN上有几个LaTeX解析器,但LaTeX::TOM看起来相当有限,LaTeX::P arser自2000年以来就没有更新过。

如果需要执行更复杂的解析,则可能需要编写自己的解析器。

最新更新