正则表达式选择方程式选择多个连续的方程式

正则表达式选择方程式选择多个连续的方程式

我尝试使用正则表达式的“查找-替换”选择所有方程式,即美元符号之间的文本\$.+\$。这应该很简单,但出现了选择过多的问题。有些方程式选择正确,例如$\theta\in\{H,L\}$在下面的 MWE 中,但有时会选择连续方程式及其之间的文本,例如$k\in\mathbb{R}$ bla bla bla iff $k\geq v_{H}$在 MWE 中。在注释和未注释的代码中。

如何从选择中排除方程式之间的文本?

梅威瑟:

\documentclass{article}

\begin{document}

$\theta\in\{H,L\}$, but
% $k\in\mathbb{R}$ bla bla bla iff $k\geq v_{H}$. 
$\Pr(H)=\mu$. 
% $1$. 
Then $\theta$ bla bla bla $c_{\theta}$ bla bla bla $v_{\theta}$. Assume 
$c_{L},v_{L}<c_{H}<\bar{v}:=\mu v_{H} + (1-\mu) v_{L}$.\footnote{
bla bla bla $c_{H}<\bar{v}$ bla bla bla if $c_{H}<\bar{v}$. 
} 

\end{document}

编辑:\$.+?\$在我的示例中没有选择任何内容。

tex.stackexchange 上的其他正则表达式问题没有解决这个问题。有时正则表达式选择正确,有时选择不正确,这一事实表明问题不是出在正则表达式语法上,而是出在 TeXstudio 上。

答案1

对于基于正则表达式的搜索和替换,TeXstudio 使用Qt 的QRegExp内部。此正则表达式实现提供了惰性量词,但仅作为整个模式的全局选项。文档中写道:

QRegExp的量词与 Perl 的贪婪量词相同 [...]。非贪婪匹配不能应用于单个量词,但可以应用于模式中的所有量词。例如,要匹配 Perl 正则表达式ro+?m需要:

QRegExp rx("ro+m");
rx.setMinimal(true);

[...] 如果最小为假,匹配是贪婪的(最大),这是默认的。

特克斯工作室不设置此标志在执行搜索时,因此看来当前版本只是不支持使用惰性量词进行搜索。

作为一种解决方法,您可以使您的模式更加具体,例如,\$.+\$您可以搜索\$[^$]+\$哪些将不允许在匹配的$外部 s 中使用额外的 s,而不是搜索。$

答案2

太长而无法发表评论的证明是\$.+?\$有效的(而我正在拖延)。l3regex也匹配数学环境(当然,因为我们在 TeX 中,所以注释行仍然是注释,所以它们不匹配):

在此处输入图片描述

\documentclass[12pt]{article}
\usepackage{xparse}
\usepackage{xcolor}
\usepackage{soul}
\ExplSyntaxOn
\regex_new:N \l__matchregex_regex
\tl_new:N \l__matchregex_tl
\NewDocumentEnvironment { matchregex } { m m b }
  {
    \regex_set:Nn \l__matchregex_regex {#1}
    \cs_set:Npn \__matchregex_function:n ##1 {#2}
    \tl_set:Nn \l__matchregex_tl {#3}
    \regex_replace_all:NnN \l__matchregex_regex
      { \c{__matchregex_function:n} \cB{ \0 \cE} } \l__matchregex_tl
    \tl_use:N \l__matchregex_tl
  }
  { }
\ExplSyntaxOff
\begin{document}
\begin{minipage}{10cm}
\begin{matchregex}{ \$.+?\$ }{\hl{#1}}
  $\theta\in\{H,L\}$, but
  % $k\in\mathbb{R}$ bla bla bla iff $k\geq v_{H}$. 
  $\Pr(H)=\mu$. 
  % $1$. 
  Then $\theta$ bla bla bla $c_{\theta}$ bla bla bla $v_{\theta}$. Assume 
  $c_{L},v_{L}<c_{H}<\bar{v}:=\mu v_{H} + (1-\mu) v_{L}$.\footnote{
  bla bla bla $c_{H}<\bar{v}$ bla bla bla if $c_{H}<\bar{v}$. 
  }
\end{matchregex}
\end{minipage}
\end{document}

相关内容