0

我不知道如何解决这个问题:

我正在尝试在test花括号
pe的帮助下搜索模式 pe ' 'test\{2,}

我想使用输入对话框添加或删除相同的模式。

pe
查找单词test{2,} 次并从匹配中删除 1 个测试
或查找单词test{2,3} 次并从匹配中删除 2 x 测试
或查找单词test{,2} 次并添加 2 x 测试以匹配

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

编辑
也许在列表中拆分子匹配字符串是一种解决方案并计算匹配数(列表的长度)。
pe 搜索test\{2,5}和删除 2 x 测试:

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

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

4

3 回答 3

1

我找到了答案。
你可以用一个通用的正则表达式来做到这一点。

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

正则表达式

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

解释:

  • 搜索test2 到 5 次,但不能搜索更多test

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

  • test找出在整个比赛中找到了多少次:

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

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

    submatch(0) = 多个 'test' (整个匹配)
    submatch(2) = 'test'

  • 重复nr。整个匹配中的匹配并添加或从中删除:

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

于 2013-08-03T07:58:37.527 回答
1

You need to enclose your string (test) in escaped parentheses so that it will operate as one unit. That gives you \(test\)\{2,}, which will find testtest, testtesttest, etc.

To replace that with just one test, try this:

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

That searches for 2 or more repetitions of test and uses \1 to replace it with a single instances of the search string.

Similarly, for your second request, just put the 3 in:

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

And for the third request, just stick in more copies of \1 to get your desired output:

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

于 2013-08-02T13:31:14.167 回答
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 
于 2013-08-02T13:47:30.293 回答