Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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 如何在Visual Studio代码中替换文档中的每一个换行符,而不是每两个(或更多)换行符?_Regex_Visual Studio Code - Fatal编程技术网

Regex 如何在Visual Studio代码中替换文档中的每一个换行符,而不是每两个(或更多)换行符?

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

我通过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>

新语境 新语境

基本上,我需要的是一个正则表达式,它将查找不在另一个空行之后或之前的所有空行。

您可能要做的是匹配一行,其中至少存在一个非空白字符。然后匹配以下空行,后跟换行符。如果空行本身包含空格,这也将考虑在内

然后使用正向前瞻来断言下一行存在非空白字符

将这些匹配项替换为第一个捕获组
$1

^([ \t]*\S.*\n)[ \t]*$\n(?=[ \t]*\S)
那会匹配的

  • ^
    字符串的开头
  • 捕获组
    • [\t]*\S.*\n
      将空格或制表符的0+倍匹配,然后是一个非空白字符,后跟匹配,直到字符串和换行符结束
  • 关闭组
  • [\t]*$\n
    匹配空行或仅匹配空格或制表符
  • (?=
    正向前瞻,断言以下内容
    • [\t]*\S)
      匹配0+次空格或制表符,后跟非空白字符
  • 关闭前瞻

试试这样的方法:

(?<!\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