如何让Vim匹配不是以七位数字开头的行?

Jas*_*own 26 regex vim

我有一个大约1000行的文件.除偶尔的行外,所有行都以七位数开头.我需要抓住这些线并实际上将它们与前一行连接起来.

我已经设法通过使用以下正则表达式模式匹配任何以七位数字开头的行:

^\d\{7}
Run Code Online (Sandbox Code Playgroud)

我似乎无法让它匹配任何此模式不匹配的行,但这正是我所追求的.

作为我将嵌入这个问题的第二个问题.是否有可能匹配(或不匹配以保持与我正在尝试的一致)的任何行将自己连接到前一行(与将下一行连接到当前行的J命令相反))?

谢谢

cha*_*aos 33

^\(\d\{7}\)\@!
Run Code Online (Sandbox Code Playgroud)

这是vim的正则表达式,用于否定前瞻.

如果你这是一个群发:命令,你应该能够做到

:v/^\d\{7}/-1j
Run Code Online (Sandbox Code Playgroud)


Kaz*_*Kaz 9

现在,真正的答案

匹配不以7位开头的字符串的正则表达式非常简单:

.{0,6}([^0-9].*)?
Run Code Online (Sandbox Code Playgroud)

没有{}语法的更经典的正则表达式实际上更具可读性:它直观地向我们展示了正在发生的事情:

(|.|..|...|....|.....|......)([^0-9].*)?
Run Code Online (Sandbox Code Playgroud)

即0到6个字符之间的匹配,可以是任何东西,可选地后跟非数字,如果它出现,可以跟随零个或多个附加字符.这确保了如果匹配七个字符或更长字符串的字符串,则前七个字符中的至少一个是非数字字符.

要将其转换为Vim中的匹配行,我们添加一些转义和锚定:

^.\{0,6\}\([^0-9].*\)\?$
Run Code Online (Sandbox Code Playgroud)

我不"做" \d; 它过于新颖了.:)


tob*_*svl 7

正则表达式

^\(\d\{7}\)\@!
Run Code Online (Sandbox Code Playgroud)

会颠倒你的原始表达.有关此语法的详细信息,请参阅此处:

:help \@!
Run Code Online (Sandbox Code Playgroud)

至于第二个问题,你可以例如用以下内容替换前一行的尾随换行符:

:%s/$\n^\(\d\{7}\)\@!//g
Run Code Online (Sandbox Code Playgroud)