Regex 如何准确地重复结果字符串中的n个匹配模式
如何在结果字符串中准确地重复n个匹配的模式 例如,如果我有以下文本:Regex 如何准确地重复结果字符串中的n个匹配模式,regex,vim,Regex,Vim,如何在结果字符串中准确地重复n个匹配的模式 例如,如果我有以下文本: ++ '[' -f /etc/bashrc ']' ++ . /etc/bashrc +++ '[' '[\u@\h \W]\$ ' ']' +++ '[' -z 'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' ']' +++ shopt -s checkwinsize +++ '[' '[\u@\h \W]\$ ' =
++ '[' -f /etc/bashrc ']'
++ . /etc/bashrc
+++ '[' '[\u@\h \W]\$ ' ']'
+++ '[' -z 'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' ']'
+++ shopt -s checkwinsize
+++ '[' '[\u@\h \W]\$ ' = '\s-\v\$ ' ']'
+++ shopt -q login_shell
+++ '[' 506 -gt 199 ']'
++++ id -gn
现在我想用3个空格替换每个“+”,但它只能在模式开始时发生。我会使用:s/^
:%s/+//g
,但如果文本的其余部分有一个“+”,我只会把它弄乱
问题是:
如何在开始时匹配每个+并在结果字符串中重复相同的find+计数?
预期:
^ ++$ -> ^ $
^ +++$ -> ^ $
^ +$ -> ^ $
谢谢如果可以接受的话,我想你必须运行一个表达式几次 您将希望运行类似以下内容(减去用于显示空白的单引号): 替换为(再次减去单引号) 不是所有可以用正则表达式解决的问题都可以只用一个正则表达式来解决——我很确定这就是其中之一 此表达式/替换对需要在加号最多的行的开头为每个加号运行一次(在上面的示例中,这将是四次)注意:如前所述,这将弄乱所有以空格和加号开头的行,所以我希望这不会发生在任何地方…试试这个:
:%s/^+*/\=repeat(' ',strlen(submatch(0)))/
submatch(0)
包含行开头的所有匹配的+
,strlen
对它们进行计数。因此,对于行首的每个加号,使用repeat
插入三个空格
有关更多信息:
:help sub-replace-expression
:help repeat()
:help submatch()
:help strlen()
这种情况下的优雅替换命令如下所示:
:%s/\%(^+*\)\@我现在就是这样做的=D,%s:^\(\s*\)+:\1/g
,但是我必须执行n次,直到没有匹配的结果。尽管我对您在那里使用的正则表达式语法不太熟悉,但我很确定至少有两个不同之处。首先,我使用线锚的开头^
,这确保不会匹配字符串“中间”的加号。第二,我重复空白任意次数(然后将其存储在第一个反向引用中,并像您一样注入替换表达式)-请随意更正:-D。。。好的,现在您已经将其更改为包含我提到的差异(????)我不熟悉那些似乎可以被注入的函数,比如使用的@dusan,因此这可能更接近您要查找的内容。另请参见问题“。@ib。您能解释一下您的表达式吗?\(an\\u s\+\)\@
:%s/^+*/\=repeat(' ',strlen(submatch(0)))/
:help sub-replace-expression
:help repeat()
:help submatch()
:help strlen()