我找不出怎么解决这个问题
我在寻找一种模式的体育课。使用花括号的“test”
体育课。test\{2,}
我希望使用input对话框将其添加到/从相同的模式中删除。
体育课。
查找单词test {2,}次数并从匹配中删除1个测试
或找到单词test {2,3}次数并从匹配中删除2x测试
或查找单词test {,2}次数并添加2x测试以匹配
我找不到准则来做我想做的事。
有人知道解决办法吗?
编辑
也许在列表中拆分子匹配字符串是一种解决方案,并计算匹配的数量(列表的长度)。
体育课。搜索test\{2,5}并删除2x测试:
%s/\(test\)\@<!\(test\)\{2,5}\(test\)\@!/\=repeat(submatch(2), len(split(submatch(2), 'test'))-2)/g但这不管用。我做错什么了?
发布于 2013-08-03 07:58:37
我找到了答案。
你可以用普通的正则表达式来完成。
解决方案是拆分搜索字符串并计算有多少匹配,并且知道有多少匹配可以从这些匹配中添加或删除。
regex:
%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)发布于 2013-08-02 13:31:14
您需要将字符串(test)括在转义括号中,以便它作为一个单元运行。这给了你\(test\)\{2,},它会找到testtest,testtesttest等。
若要将其替换为一个test,请尝试如下:
:%s/\(test\)\{2,}/\1/g
它搜索两个或更多的test重复,并使用\1将其替换为搜索字符串的单个实例。
同样,对于第二个请求,只需将3放入:
:%s/\(test\)\{2,3}/\1/g
对于第三个请求,只需添加更多的\1副本即可获得所需的输出:
:%s/\(test\)\{,2}/\1\1\1/g
发布于 2013-08-02 13:47:30
如果我正确理解你的要求,答案可能会有所帮助。
我将在示例中使用test(space) ,并且该示例具有结束空间
[before ]test test foo test test test foo test
[command]s/\v(test )(\1+)/\2/g
[after ]test foo test test foo test [before ]test test foo test test test foo test
[command]s/\v(test ){2}(\1?)/\2/g
[after ]foo test foo 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 https://stackoverflow.com/questions/18018052
复制相似问题