如何在大括号的帮助下搜索模式并从模式中添加/删除?

时间:2013-08-02 13:26:13

标签: regex vim substitution

我无法找到解决方法:

我正在尝试搜索模式p.e. 'test'在Curly braces的帮助下 体育test\{2,}

我想使用inputdialog添加或删除相同的模式。

体育课。
找到单词test {2,}次,并从匹配中删除1个测试 或找到单词test {2,3}次并从匹配中删除2 x test 或找到单词test {,2}次并添加2 x测试以匹配

我找不到正则表达式来做我想做的事 有谁知道解决方案?

修改
也许在列表中拆分子匹配字符串是一种解决方案,并计算匹配的数量(列表的长度) 体育搜索test\{2,5}并删除2 x test:

%s/\(test\)\@<!\(test\)\{2,5}\(test\)\@!/\=repeat(submatch(2), len(split(submatch(2), 'test'))-2)/g

但这不起作用。 我错了什么?

3 个答案:

答案 0 :(得分:1)

您需要将字符串(test)括在转义括号中,以便它作为一个单元运行。这会为您\(test\)\{2,}提供testtesttesttesttest等等。

要仅使用一个test替换它,请尝试以下操作:

:%s/\(test\)\{2,}/\1/g

搜索重复test的两次或更多次,并使用\1将其替换为搜索字符串的单个实例。

同样,对于第二个请求,只需将3放入:

:%s/\(test\)\{2,3}/\1/g

对于第三个请求,只需添加\1的更多副本即可获得所需的输出:

:%s/\(test\)\{,2}/\1\1\1/g

答案 1 :(得分:1)

如果我理解你的要求,答案可能有所帮助。

我会在示例中使用test(space),示例有结尾空间

  
      
  • 找到单词test {2,}次并从匹配中删除1个测试
  •   
[before ]test test foo test test test foo test 
[command]s/\v(test )(\1+)/\2/g
[after  ]test foo test test foo test 
  
      
  • 找到单词test {2,3}次并从匹配中删除2 x test
  •   
[before ]test test foo test test test foo test 
[command]s/\v(test ){2}(\1?)/\2/g
[after  ]foo test foo test 
  
      
  • 找到单词test {,2}次并添加2 x test以匹配
  •   
[before ]test test foo test test test foo test 
[command]s/\v(test ){,2}/&\1\1/g
[after  ]test test test test foo test test test test test test test foo test test test 

答案 2 :(得分:1)

我找到了答案 你可以使用一般的正则表达式。

解决方案是拆分搜索字符串并计算有多少匹配,并且在知道可以在这些匹配中添加或删除多少匹配之后。

正则表达式

%s/\(test\)\@<!\(test\)\{2,5}\(test\)\@!/\=repeat(submatch(2), len(split(submatch(0), '\ze'.submatch(2)))+2)/g

解释

  • 搜索test 2至5次,但不会在更多test字符串中搜索:

    \(test\)\@<!\(test\)\{2,5}\(test\)\@!

  • 查找在整场比赛中找到test的次数:

    len(split(submatch(0), '\ze'.submatch(2))

    用nr分割整个比赛。单场比赛并计算单场比赛

    submatch(0)=多次'测试'(整场比赛)
     submatch(2)='test'

  • 重复nr。来自整场比赛的比赛,并在其中添加或删除:

    \=repeat(submatch(2), len(split(submatch(0), '\ze'.submatch(2)))+2)