Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何连接所有线路直到下一个条件?_Regex_Join_Vim_Lines - Fatal编程技术网

Regex 如何连接所有线路直到下一个条件?

Regex 如何连接所有线路直到下一个条件?,regex,join,vim,lines,Regex,Join,Vim,Lines,直到下一个条件发生(只有一个或多个数字的行)p.e.我才知道如何连接所有行 输入: 1 text text text text (with numbers) text text text text (with numbers) 2 this text text text text text (with numbers) text text text 3 text text text text (with numbers) 4 etc 设计输出

直到下一个条件发生(只有一个或多个数字的行)p.e.我才知道如何连接所有行

输入:

1    
text text text text (with numbers)   
text text text text (with numbers)    
2
this text   
text text text text (with numbers)  
text text text  
3  
text text text text (with numbers)  
4  
etc  
设计输出:

1 text text text text (with numbers) text text text text (with numbers)    
2 this text text text text text (with numbers) text text text  
3 text text text text (with numbers)  
4  
etc

我通常使用
global/^/,+2 join
,但在上面的示例中,要连接的行数并不总是3。

v/^\d\+/-j
就可以了

v
为每个不匹配的条件执行函数
^\d\+
您的条件:以数字开头的行。
-j
将连接向后移动一行。或者,如果希望将当前行与前一行合并


因此,基本上,我们将所有与前一行条件不匹配的行连接起来。

而不是
+2
命令范围的静态
:join
结束,只需为下一行指定一个只包含一个数字的搜索范围(
/^\d\+$/
),然后连接到前一行(
-1
):


正是因为Tim的评论,即使用Vim仅使用正则表达式搜索和替换是无法完成的,我提出了以下内容:如何使用Vim仅使用正则表达式搜索和替换:

:%s#\s*\n\(\d\+\s*\n\)\@!# #
如果您不喜欢反斜杠,可以使用“非常神奇”的方法简化它:

:%s#\v\s*\n(\d+\s*\n)@!# #
这是根据同一条评论中给出的Tim的Perl风格正则表达式改编而成的,改进后的正则表达式确保“停止行”只有数字(可能还有尾随的空格)


如果您熟悉perl,并且发现自己在使用Vim正则表达式方言时遇到问题,请参阅
:帮助perl模式。

Vim只支持POSIX样式的正则表达式,不支持lookaround-因此,如果必须使用Vim,那么它就不能单独使用正则表达式。如果您可以使用其他编辑器,则很容易:将
\s*\n(?!^\d)
替换为一个空格。这个问题很好,有示例数据、所需输出和尝试的步骤。这值得投票@tim您假设解决这个问题的唯一方法是使用lookaround,然后vim没有lookaround regexp。这两种假设都是错误的,很有趣。vim my Google搜索的regex文档只包含POSIX。但是,是的,也可以不用周围的人。我太悲观了。应该注意的是,这并没有正确地加入最后一节。请注意@mb14 solutionWorks很好。它返回一个错误(E16:无效范围),但它仍然执行我想要的操作。Tnx。(感谢向上投票)当没有下面的数字行时,抛出错误。这是可以避免的,但会使命令更加复杂。如果这适合您的数据(并且您可以在末尾临时添加另一个数字),请忽略它。
:%s#\v\s*\n(\d+\s*\n)@!# #