【问题标题】:Regex perl match delimited LaTeX text正则表达式 perl 匹配分隔的 LaTeX 文本
【发布时间】:2017-09-15 06:07:03
【问题描述】:

我正在读取一个 .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}}$

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

【问题讨论】:

标签: regex perl text


【解决方案1】:

我建议使用一种工具来处理平衡/嵌套分隔符的(复杂)问题,而不是尝试手动解析它。也许首先看一下核心Text::BalancedRegexp::Common。请参阅 this post 了解它们的使用示例,这也非常接近您的需要。


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

如果这个公式总是内联的,即在$...$之间,那么那些$就解决了问题

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 修饰符允许空格以便于阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2012-03-24
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多