我无法找到解决方法:
我正在尝试搜索模式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
但这不起作用。 我错了什么?
答案 0 :(得分:1)
您需要将字符串(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
答案 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)