正则表达式Perl匹配分隔的LaTeX文本

regex perl text

90 观看

1回复

1 作者的声誉

我正在读取.tex文件,并根据模式进行替换以保存到另一个.tex文件中。我的左定界符是

\ket{

右定界符是

}

正则表达式\\ket\{(.+)\}可以匹配

\ ket {0}

但具有复杂的线条,例如

$ \ ket {\ bfG \ bfP ^ L_ {2ex}} $,以及实际空间$ \ ket {\ bfP ^ L_ {2ex}} $

它匹配整个文本

\ bfG \ bfP ^ L_ {2ex}} $和实际空间$ \ ket {\ bfP ^ L_ {2ex}

修改正则表达式为

\\ket{([^{}]*|[^}])*}{1,2}

我可以检测到提​​到的复杂线,但在某些情况下

倒数格$ \ ket {\ bfG \ bfP ^ L_ {2ex} {3} {2}} $和实空间$ \ ket {\ bfP ^ L_ {2ex}} $

那行不通。我该如何解决?为了解决此类问题,我必须阅读哪些算法/主题/书籍/教程?

作者: iaveiga 的来源 发布者: 2017 年 9 月 15 日

回应 1


2

40851 作者的声誉

我建议找到一种工具来处理平衡/嵌套定界符的(复杂)问题,而不是尝试手动解析它。也许先看看核心Text :: BalancedRegexp :: Common。请参阅此帖子以获取其用法示例,该示例也非常接近您的需求。


在这种情况下,您可以通过使用字符串的特定属性来回避问题。

如果此公式始终是内联的,即介于之间$...$,则这些将$解决问题

use warnings;
use strict;
use feature 'say';

my $line = q( 
   $\ket{\bfG \bfP^L_{2ex}}$, and the real space, $\ket{\bfP^L_{2ex}}$ 
);

my @kets = $line =~ m| \$\\ket{ (.+?) }\s*\$ |gx;

say for @kets;

此打印

\ bfG \ bfP ^ L_ {2ex}
\ bfP ^ L_ {2ex}

这很容易,因为您所需的文本恰好在文字$\ket{和下一个之间}$; 里面没有什么问题,因此嵌套定界符也没有问题。

.+?场比赛的所有字符以下的模式,在这里}$(带有可选的空间,\s*以防万一)。在$\需要进行转义。该|x修改允许使用空格,以提高可读性。

作者: zdim 发布者: 2017 年 9 月 15 日
32x32