首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在花括号的帮助下搜索模式并从模式中添加/删除?

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

Stack Overflow用户
提问于 2013-08-02 13:26:13
回答 3查看 163关注 0票数 0

我找不出怎么解决这个问题

我在寻找一种模式的体育课。使用花括号的“test

体育课。test\{2,}

我希望使用input对话框将其添加到/从相同的模式中删除。

体育课。

查找单词test {2,}次数并从匹配中删除1个测试

或找到单词test {2,3}次数并从匹配中删除2x测试

或查找单词test {,2}次数并添加2x测试以匹配

我找不到准则来做我想做的事。

有人知道解决办法吗?

编辑

也许在列表中拆分子匹配字符串是一种解决方案,并计算匹配的数量(列表的长度)。

体育课。搜索test\{2,5}并删除2x测试:

代码语言:javascript
复制
%s/\(test\)\@<!\(test\)\{2,5}\(test\)\@!/\=repeat(submatch(2), len(split(submatch(2), 'test'))-2)/g

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-03 07:58:37

我找到了答案。

你可以用普通的正则表达式来完成。

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

regex

代码语言:javascript
复制
%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分割整场比赛。对单个火柴进行计数。 子匹配(0)=多个“测试”(完全匹配) 次匹配(2)=“测试”
  • 重复一遍。在整个匹配中添加或移除匹配: \=repeat(submatch(2), len(split(submatch(0), '\ze'.submatch(2)))+2)
票数 1
EN

Stack Overflow用户

发布于 2013-08-02 13:31:14

您需要将字符串(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
EN

Stack Overflow用户

发布于 2013-08-02 13:47:30

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

我将在示例中使用test(space) ,并且该示例具有结束空间

  • 查找单词test {2,}次数,并从匹配中删除1个测试

代码语言:javascript
复制
[before ]test test foo test test test foo test 
[command]s/\v(test )(\1+)/\2/g
[after  ]test foo test test foo test 

  • 查找单词测试{2,3}次数,并从匹配中删除2x测试

代码语言:javascript
复制
[before ]test test foo test test test foo test 
[command]s/\v(test ){2}(\1?)/\2/g
[after  ]foo test foo test 

  • 查找单词test {,2}次数,并添加2x测试以匹配

代码语言:javascript
复制
[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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18018052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档