Regex Vim:在捕获组中使用集合(或:用不同的标记替换标记)

Regex Vim:在捕获组中使用集合(或:用不同的标记替换标记),regex,vim,Regex,Vim,我有一个Latex文档,我希望替换所有mathmode标记$$及其适当的乳胶等效物\(..\) 我使用了这个正则表达式:%s/\$\(.\+\)\$/\(\1\\)/gc,但在一行中有多个标记对的简单情况下,这当然失败了,即 This is an example: $ 1+2=3 $ and $4+5=9$ 解决这个问题的简单方法是什么?我尝试在我的捕获组中使用这样的集合:\([^\$]\),但这不匹配 编辑:\([^\$]\)不匹配的原因是因为我没有像这样向它添加一个量词:\([^\$]\+

我有一个Latex文档,我希望替换所有mathmode标记
$$
及其适当的乳胶等效物
\(..\)

我使用了这个正则表达式:
%s/\$\(.\+\)\$/\(\1\\)/gc
,但在一行中有多个标记对的简单情况下,这当然失败了,即

This is an example: $ 1+2=3 $ and $4+5=9$
解决这个问题的简单方法是什么?我尝试在我的捕获组中使用这样的集合:
\([^\$]\)
,但这不匹配

编辑:
\([^\$]\)
不匹配的原因是因为我没有像这样向它添加一个量词:
\([^\$]\+\)
。正如公认答案下的评论所示,这也会起作用

:%s/\$\(.\{-1,}\)\$/\\(\1\\)/gc
使用非贪婪量词
\{-1,}
代替贪婪的
\+

:帮助/\{

使用非贪婪量词
\{-1,}
代替贪婪的
\+


:help/\{

我也会使用非贪婪限定符,但将条件更改为开始/结束数学环境:

:%s/\(\\\)\@<!\$\(.\{-1,}\)\(\\\)\@<!\$/\\(\2\\)/g
:%s/\(\\\)\@

因此,我会使用一些lookback来确保$不在\后面,而\会逃逸它。

我也会使用非贪婪限定符,但会更改条件以开始/结束数学环境:

:%s/\(\\\)\@<!\$\(.\{-1,}\)\(\\\)\@<!\$/\\(\2\\)/g
:%s/\(\\\)\@

因此,我会使用一些lookback来确保a$不在a\之后,后者会逃逸它。

您可以处理一些逃逸的$(
\$
)?所以它应该允许\$在数学环境中。但我不知道是否以及如何实现某些条件。当得到$Amadan的答案时,它可能会检查前面是否有\对我来说很好。你是对的,尽管人们应该想到逃逸的
$
标志,但幸运的是我的案例中没有这些标志:)。你可以开车一些转义的$(
\$
)的e?因此它应该允许\$进入数学环境。但我不知道是否以及如何实现某些条件。它可能会检查在获得$Amadan的答案时前面是否有\对我来说很好。你是对的,尽管人们应该想到转义的
$
符号,但幸运的是,我的案例中没有这些符号:)。谢谢!这是真的确实有帮助。我非常专注于让集合与捕获组一起工作,以至于我甚至没有考虑贪婪与非贪婪!编辑:你知道集合是否在捕获组中工作吗?(只是出于兴趣)如果你说的“集合”是指字符类,那么它们是:
:%s/\$\([^\$]\+\)\$/\\(\1\\)/gc
应该做与上面相同的事情。@adaman嗯,它对我不起作用,但我错过了
\+
位。再说一次,我认为它不应该是必要的。如果你只有
$x$
$f$
这样的东西,它就没有必要了。如果你想处理包含多个字符的表达式,它就是quite必需。
[^…]
是“非此集合中的任何一个字符”。这就解释了我使用这个失败的原因。谢谢你启发我:)谢谢!这确实有帮助。我太专注于让集合与捕获组一起工作,以至于我甚至没有考虑贪婪与非贪婪!编辑:你知道集合是否在捕获组中工作吗?(只是出于兴趣)如果是“集合”你是说字符类,它们是:
:%s/\$\([^\$]\+\)\$/\\(\1\\)/gc
应该做与上面相同的事情。@adaman嗯,它对我不起作用,但我错过了
\+
位。再说一次,我认为它不应该是必要的。如果你只有
$x$
$f$
这样的东西,它就没有必要了。如果你想处理包含多个字符的表达式,它就是quite必需。
[^…]
是“非此集合中的任何一个字符”)你的答案对我来说太神奇了。我还没试过,阿玛丹的答案对我来说很有效,但把它放在这里很好,以防其他人需要注意逃逸的
$
信号你的答案对我来说太神奇了。没有试过,阿玛丹的答案对我来说太神奇了这对我来说很好,但在这里有它很好,以防其他人需要处理逃逸的
$
标志