我通过FTP下载文件,并在每行后添加换行符。现在,在我的代码中,我为上下文添加了空白行。下载后,我添加的每个空行现在是三个空行。
因此,如果我删除所有空白行与正则表达式,如^\n
,它也会删除我为上下文添加的那些行。而这个^\n{1}
也没有帮助。
这是我通过FTP下载后的HTML示例:
<nav>
<ul>
<li><a href="#">London</a></li>
<li><a href="#">Paris</a></li>
<li><a href="#">Tokyo</a></li>
</ul>
</nav>
<div>new context</div>
<div>new context</div>
这就是我希望它看起来像:
<nav>
<ul>
<li><a href="#">London</a></li>
<li><a href="#">Paris</a></li>
<li><a href="#">Tokyo</a></li>
</ul>
</nav>
<div>new context</div>
<div>new context</div>
基本上我需要的是一个正则表达式,它可以找到不在另一个空行之前或之前的所有空行。
这可以找到一个空白行
发现:(\S[^\S\n]*\n)[^\S\n]*\n(?![^\S\n]*\n)
替换:$1
https://regex101.com/r/7IbV1Y/1
解释
( \S [^\S\n]* \n ) # (1) A line with a piece of non-wsp text
[^\S\n]* \n # Single blank line with a line break
(?! [^\S\n]* \n ) # Not a blank line with a line break ahead
你可能会做的是匹配一条存在至少非空白字符的行。然后匹配以下空行,后跟换行符。这也将考虑空行本身是否包含空格。
然后使用正向前瞻来断言在下一行中存在非空白字符。
将这些匹配替换为第一个捕获组$1
^([ \t]*\S.*\n)[ \t]*$\n(?=[ \t]*\S)
这将匹配
^
字符串的开头(
捕获组
[ \t]*\S.*\n
匹配空格或制表符的0+倍,然后是非空格字符,然后匹配,直到字符串的结尾和换行符)
关闭组[ \t]*$\n
匹配空行或仅匹配空格或制表符(?=
积极前瞻,断言如下
[ \t]*\S)
匹配空格或制表符的0+倍,后跟非空格字符)
关闭前瞻在vscode中按Ctrl + F启用正则表达式并将以下内容插入“查找”字段:
>\n\n(?!\n)
和
>\n
进入替换字段。现在选择全部替换。
这将导致您在原始问题中描述的结果。我用vscode 1.32.3测试了它
编辑:
在看到Valdi_Bo的answer之后,这似乎是一个非常好的解决方案。唯一的问题是,它在VS Code中无法正常工作。因此,为了使其在VS Code中工作,您必须更新到版本1.32并将正则表达式更改为:
(?<!^\n)^\n(?!\n$)
然后我得到了所需的结果,如下所示:https://regex101.com/r/b3Jnk2/1
上一个答案:
这个正则表达式为我做了。
^(\n)(?!\n{2})
这是我得到的结果:
<nav>
<ul>
<li><a href="#">London</a></li>
<li><a href="#">Paris</a></li>
<li><a href="#">Tokyo</a></li>
</ul>
</nav>
<div>new context</div>
<div>new context</div>
执行此操作后,您仍然需要删除几个空行而不是那些为上下文添加的空行,请使用此正则表达式:^(\n{2})