Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex vim中分隔符之间的增量数字_Regex_Vim_Replace - Fatal编程技术网

Regex vim中分隔符之间的增量数字

Regex vim中分隔符之间的增量数字,regex,vim,replace,Regex,Vim,Replace,我的问题是关于一个非常具体的搜索和替换模式,但我希望能为更一般的情况找到答案。我目前正在制作一些LaTeX幻灯片,其中包含allot of overlays,我需要将某些整数增加一个或多个。示例文本: \only<1,5-7,9>{hello 11} 从当前行到文件末尾,它将大于2的所有整数递增1。这意味着11也会增加,这不是我想要的: \only<1,6-8,10>{hello 12} \only{hello 12} Q1:如何仅匹配和递增分隔符“”之间的整数

我的问题是关于一个非常具体的搜索和替换模式,但我希望能为更一般的情况找到答案。我目前正在制作一些LaTeX幻灯片,其中包含allot of overlays,我需要将某些整数增加一个或多个。示例文本:

\only<1,5-7,9>{hello 11}
从当前行到文件末尾,它将大于2的所有整数递增1。这意味着11也会增加,这不是我想要的:

\only<1,6-8,10>{hello 12}
\only{hello 12}
Q1:如何仅匹配和递增分隔符“”之间的整数


最终,我希望能够通过指定一个模式并将另一个模式应用到结果中来逐步完善搜索模式。例如,我首先匹配给定示例文本中分隔符之间的文本

/<[^<>]*>
/
这将突出我引用的文本:

\only"<1,5-7,9>"{hello 11}
\only”“{hello 11}
现在应用我原来的解决方案,增加分隔符之间的数字。我可以比较将grep命令与管道符号链接在一个shell中,并使用每个新的grep命令细化结果

Q2:这种vim搜索模式的链接可能吗


更新:Floris的解决方案非常接近。事实上,它解决了最初的问题,但我没有提到所有要求。它们是:

- The delimiters are guaranteed to be on one line, e.g., <1,5-7,9>.
- Multiple delimited parts can be on one line, e.g.:
   hello 11\only<1,6-7,9>{hello 11}\only<1,6-7,9>{hello 11}
-分隔符保证在一行上,例如。
-多个分隔的零件可以在一行上,例如:
hello 11\only{hello 11}\only{hello 11}
第二个要求失败,因为解决方案当前返回:

hello 12\only<1,7-8,10>{hello 12}\only<1,7-8,10>{hello 11}
hello 12\only{hello 12}\only{hello 11}
它只忽略上次出现'>'后的整数。我希望结果是:

hello 11\only<1,7-8,10>{hello 11}\only<1,7-8,10>{hello 11}
hello 11\only{hello 11}\only{hello 11}

谢谢你的帮助

如果您可以假设
\only您需要一个
前瞻
结构-我认为它如下所示:

:.,$s/[0-9]\+\(.*>\)\@=/\=str2float(submatch(0))>2?submatch(0)+1:submatch(0)/g
我补充的是

\(.*>\)\@=
这是一个“正向前瞻”,一个零宽度断言,表示

前面的内容后面必须跟任意数量的字符,后面必须跟紧括号

您可以在vim帮助中找到更多关于语法的信息,或者(我就是从这里得到它的)

运行上面的程序,我得到了

\only<1,6-8,10>{hello 11}
\only{hello 11}
作为输出-这是我认为你想要的


注意:我在Mac上的vim中测试了这一点。众所周知,它的行为与linux版本稍有不同(好吧,我是从
sed
差异推断出来的,我实际上不知道
vim
也不同……)。如果这不起作用,它应该是非常接近的。< /P> < P>关于正则表达式的问题当然是相关的,但是关于你的重叠太多,也许你应该考虑使用名称而不是数字:TeXTrac上的一个解决方案是:


您基本上只需要在某些位置(即
部件内部)应用搜索和替换(使用可以计算条件的表达式!)

这很难,因为您需要:

  • 仔细指定具有“向前看”和“向后看”的匹配条件(正如其他答案所尝试的),或
  • 匹配
    ,并在内部执行另一个替换,这是Vim不允许的(递归子替换表达式(
    \=…
    )是不可能的)
my的新版本1.30可以处理以下问题:

首先,搜索
位置:

/<[^>]\+>

我认为问题在于,替换将继续使用
hello
之后的数字。你需要一个
lookaround
表达式(“介于
之间的数字”),我不确定vim的正则表达式是否支持它?@Floris啊……我希望这篇文章能显示预期的结果……:{这是合理的;但他说“这意味着11也在递增,这不是我想要的。”"。它真的非常接近。但有一个案例失败了,这是我的错,因为我在问题中没有提到它。虽然分隔符位于同一行上,但行上可能有多个分隔部分。我将更新我的问题。你真的想让这变得很难,不是吗?!…我想如果
之间只有逗号、连字符和数字,但现在无法测试,希望在我做出另一个“几乎”的回答之前得到确认……我尝试:)我想您可以将其视为由字符[,-]括起的数字,而不是之间的数字。
\only<1,6-8,10>{hello 11}
/<[^>]\+>
:%SubstituteInSearch/\d\+/\=submatch(0) > 2 ? submatch(0) + 1 : submatch(0)/g