Regex 如何在Visual Studio代码中替换文档中的每一个换行符,而不是每两个(或更多)换行符?
我通过FTP下载了文件,它在每行之后都添加了换行符。现在,在我的代码中,为上下文添加了空行。下载后,我添加的每一个空行现在是三个空行 因此,如果我删除所有带有正则表达式的空行,比如Regex 如何在Visual Studio代码中替换文档中的每一个换行符,而不是每两个(或更多)换行符?,regex,visual-studio-code,Regex,Visual Studio Code,我通过FTP下载了文件,它在每行之后都添加了换行符。现在,在我的代码中,为上下文添加了空行。下载后,我添加的每一个空行现在是三个空行 因此,如果我删除所有带有正则表达式的空行,比如^\n,它也会删除我为上下文添加的那些行。这个^\n{1}也没有帮助 这是我现在通过FTP下载的HTML示例: <nav> <ul> <li><a href="#">London</a></li> <li>&l
^\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>
新语境
新语境
基本上,我需要的是一个正则表达式,它将查找不在另一个空行之后或之前的所有空行。您可能要做的是匹配一行,其中至少存在一个非空白字符。然后匹配以下空行,后跟换行符。如果空行本身包含空格,这也将考虑在内 然后使用正向前瞻来断言下一行存在非空白字符 将这些匹配项替换为第一个捕获组
$1
^([ \t]*\S.*\n)[ \t]*$\n(?=[ \t]*\S)
那会匹配的
字符串的开头^
捕获组(
将空格或制表符的0+倍匹配,然后是一个非空白字符,后跟匹配,直到字符串和换行符结束[\t]*\S.*\n
关闭组)
匹配空行或仅匹配空格或制表符[\t]*$\n
正向前瞻,断言以下内容(?=
匹配0+次空格或制表符,后跟非空白字符[\t]*\S)
关闭前瞻)
试试这样的方法:
(?<!\n)\n(?!\n$)
(?
使用g
和m
选项,并替换为空字符串
有关工作示例,请参见编辑:
在看到后,它似乎是一个非常好的解决方案。唯一的问题是,它在VS代码中无法正常工作。因此,为了使它在VS代码中工作,您必须更新到1.32版,并将正则表达式更改为:
(?<!^\n)^\n(?!\n$)
完成此操作后,仍有几行空行需要删除,但没有添加到上下文中的空行,请使用以下正则表达式:
在vscode中单击Ctrl+F enable regex并在查找字段中插入以下内容时,^(\n{2})
:
及
进入替换字段。现在选择全部替换
这将导致您在原始问题中描述的结果。我使用vscode 1.32.3对其进行了测试,这可以找到一个空行
查找:(\S[^\S\n]*\n)[^\S\n]*\n(?![^\S\n]*\n)
替换:$1
^([ \t]*\S.*\n)[ \t]*$\n(?=[ \t]*\S)
解释
( \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
如何在VS代码中使用g
和m
选项?搜索Weg。例如,我不知道VS代码的确切设置,但g
表示全局,而m
表示多行。这里有一个多行资源,至少:不是所有浏览器都支持反向查找功能。我认为VS代码中不支持它,since它返回了一个错误。@saritonin经过研究,我认为这是在正则表达式中使用\n
时的默认值。如多行所示:它删除了所有行末端的所有结束标记。确定您没有忘记替换框中的\n
吗?对我来说,它在vscode 1.32.3Ah中按预期工作,我的错误,我错过了它t>替换字段中的结束标记。当从ftp下载的文件在这样的情况下损坏时,这会非常有帮助。最好的办法是确保下次不会发生这种情况,请参阅-啊,现在它可以工作了!我不认为上次更新有那么重要。也可以在有空格的行上工作。如果您希望它只在没有空格的行上工作有空格,然后看我的答案。
>\n
( \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