我尝试使用正则表达式的“查找-替换”选择所有方程式,即美元符号之间的文本\$.+\$
。这应该很简单,但出现了选择过多的问题。有些方程式选择正确,例如$\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}