将 x*(string) 形式的表达式替换为该字符串的 x 个副本

发布于 2024-10-25 02:33:44 字数 420 浏览 1 评论 0原文

我有一些 3*(item1; item2; item3;) 形式的表达式,我想将它们替换为 item1;item2;item3;item1;item2;item3;item1;item2;item3; (即括号中的 3 个内容,不包括括号)

我可以编写一个正则表达式来提取相关部分,但我不确定如何做其他部分——我尝试了 submatch() 和eval() 但我还没有找到一种将字符串与其自身连接特定次数的方法:

:%s/\(\d+\)\*(\(\_[^)]\+\))/这里发生了什么......?

我曾希望像 \2{\1} 这样的东西可以工作,但这不会评估大括号中的数字。如果我以错误的方式处理这件事,那也没关系——我并不是特别热衷于这样做,这只是我所知道的,我只是想知道这在 Vim 中是否很容易实现。

谢谢如果有人可以帮忙!

I have some expressions of the form 3*(item1; item2; item3;), and I want to replace them with item1;item2;item3;item1;item2;item3;item1;item2;item3; (i.e. 3 lots of the thing in brackets, not including the brackets)

I can write a regex to extract the relevant parts, but I'm not sure how to do the other part -- I had a play around with submatch() and eval() but I've not found a way to concatenate a string to itself a specific number of times:


:%s/\(\d+\)\*(\(\_[^)]\+\))/what goes here...?

I had hoped something like \2{\1} would work, but that doesn't evaluate the number in braces. If I'm going about this the wrong way that's fine -- I'm not particularly tied to doing it this way, it's just what I sort of know, and I just wondered if it was easily possible in Vim.

Thanks if anyone can help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不乱于心 2024-11-01 02:33:44

无需自定义功能。您可以以相同的方式使用内置的repeat()

%s#\v(\d+)\*\((\_[^)]+)\)#\=repeat(submatch(2), submatch(1))#gc

更多信息这里的 :help Repeat():help function-list 是内置函数的列表。

No need for custom function. You can use the built-in repeat() the same way.

%s#\v(\d+)\*\((\_[^)]+)\)#\=repeat(submatch(2), submatch(1))#gc

more info here :help repeat() and :help function-list for a list of built-in functions.

还不是爱你 2024-11-01 02:33:44

您可以定义一个函数来重复复制字符串...

function! RepeatString(n,s)
  let l:result=""
  let l:n=a:n
  while l:n>0
    let l:result = l:result . a:s
    let l:n = l:n-1
  endwhile
  return l:result
endfunction

(注意:如果 n 很大,则效率非常低;例如,创建列表并调用 join 很可能是更高效),然后使用 :s 的表达式求值功能 ...

:%s/\(\d\+\)\*(\([^)]\+\))/\=RepeatString(submatch(1),submatch(2))/g

(注意:我的正则表达式和你的正则表达式之间有一些差异,这可能是原始问题中拼写错误的结果)。

You could define a function that makes a repeated copy of a string ...

function! RepeatString(n,s)
  let l:result=""
  let l:n=a:n
  while l:n>0
    let l:result = l:result . a:s
    let l:n = l:n-1
  endwhile
  return l:result
endfunction

(note: this is very inefficient if n is large; it may well be that, e.g., making a list and calling join is more efficient) and then use the expression-evaluating feature of :s ...

:%s/\(\d\+\)\*(\([^)]\+\))/\=RepeatString(submatch(1),submatch(2))/g

(note: there are a couple of differences between my regexp and yours, which may be the results of typos in the original question).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文