Javascript 仅删除某些其他匹配行之间的空行

Javascript 仅删除某些其他匹配行之间的空行,javascript,regex,Javascript,Regex,我试图删除与特定模式匹配的其他行之间的空行。在我的例子中,这种模式只是线条以-字符开始 const orig = ` - line1 - line2 - line3 - line4 - line5 `.trim(); const actual = orig.replace(/((?:^|\n)-.*\n)\n(-)/g, '$1$2'); 在上面的代码中,我使用正则表达式来匹配: 换行符或字符串开头,后跟。。。 带前缀的行,后跟。。 一个空行,后面是。。。 另一个- 我用两个捕获

我试图删除与特定模式匹配的其他行之间的空行。在我的例子中,这种模式只是线条以-字符开始

const orig = `
- line1

- line2

- line3

- line4

- line5
`.trim();

const actual =
  orig.replace(/((?:^|\n)-.*\n)\n(-)/g, '$1$2');
在上面的代码中,我使用正则表达式来匹配:

换行符或字符串开头,后跟。。。 带前缀的行,后跟。。 一个空行,后面是。。。 另一个- 我用两个捕获组全局替换整个表达式,这两个捕获组省略了它们之间的空行。这种工作方式和我预期的一样,但是省略了所有其他空行,我不知道为什么

我希望上面的代码能给我以下信息:

- line1
- line2
- line3
- line4
- line5
…它实际上给了我这个:

- line1
- line2

- line3
- line4

- line5
问题:是什么原因导致了这种行为


奖励:有更好的方法吗?e、 g.通过拆分/缩减-尽管我仍然想知道它为什么不起作用

这将为您提供所需的-

const actual = orig.replace(/\n\n|\r\r/g, "\n");

这会给你你需要的-

const actual = orig.replace(/\n\n|\r\r/g, "\n");

你可以用下面的方法来做

常数=` -第1行 -第2行 -第3行 -第4行 -第5行 `.修剪; 常量实际值= 原始替换/\-[^\n]*[^-]*?=-/g,$1\n'; document.getElementById'orig'。innerText=orig; document.getElementById'actual'。innerText=actual; 起初的 预期 真实的
你可以用下面的方法来做

常数=` -第1行 -第2行 -第3行 -第4行 -第5行 `.修剪; 常量实际值= 原始替换/\-[^\n]*[^-]*?=-/g,$1\n'; document.getElementById'orig'。innerText=orig; document.getElementById'actual'。innerText=actual; 起初的 预期 真实的 最后一个是消费模式的一部分。一旦-matches,正则表达式索引将设置在该-,并且您无法找到该匹配项,因为-in?:^ | \n-无法匹配该-。你需要把它放在一个积极的展望中。然后,您需要使用m修饰符使“^”匹配行的起始位置,而不仅仅是字符串的起始位置

使用

看。由于只剩下一个捕获组,替换字符串减少到$1

下面是固定表达式演示:

常数=` -第1行 -第2行 -第3行 -第4行 -第5行 `.修剪; 常量实际值= 原始替换/?:^ |\n-.*\n\n?=-/gm,$1; document.getElementById'orig'。innerText=orig; document.getElementById'actual'。innerText=actual; ul{字体系列:无衬线;列表样式:无;填充:0;} li{显示:内联块;填充:1em;垂直对齐:顶部;} 起初的 预期 真实的 最后一个是消费模式的一部分。一旦-matches,正则表达式索引将设置在该-,并且您无法找到该匹配项,因为-in?:^ | \n-无法匹配该-。你需要把它放在一个积极的展望中。然后,您需要使用m修饰符使“^”匹配行的起始位置,而不仅仅是字符串的起始位置

使用

看。由于只剩下一个捕获组,替换字符串减少到$1

下面是固定表达式演示:

常数=` -第1行 -第2行 -第3行 -第4行 -第5行 `.修剪; 常量实际值= 原始替换/?:^ |\n-.*\n\n?=-/gm,$1; document.getElementById'orig'。innerText=orig; document.getElementById'actual'。innerText=actual; ul{字体系列:无衬线;列表样式:无;填充:0;} li{显示:内联块;填充:1em;垂直对齐:顶部;} 起初的 预期 真实的
这种行为的原因是正则表达式不重叠匹配项。它消耗并匹配:

  line 2

- line 3
替换为:

<newline>
- line 3

-
然后从上一个匹配的末尾继续遍历字符串

因此,它与下一个换行符不匹配,因为

<newline>
- line 3
-
不包含与您的模式匹配的。下一个与您的模式匹配的是

const actual = orig.replace(/^(-.*\n)\n(?=-)/gm, '$1');
我还将?:^ |\n-.\n\n更改为^-.\n\n,并添加了m标志,因为行的起始断言^不需要在捕获组中,并且\n会导致删除前面的换行符

该模式也可以修改以匹配任意数量的bl;与图案匹配的线条之间的线条:


这种行为的原因是正则表达式不重叠匹配项。它消耗并匹配:

  line 2

- line 3
替换为:

<newline>
- line 3

-
然后从上一个匹配的末尾继续遍历字符串

因此,它与下一个换行符不匹配,因为

<newline>
- line 3
-
不包含与您的模式匹配的。下一个与您的模式匹配的是

const actual = orig.replace(/^(-.*\n)\n(?=-)/gm, '$1');
我还将?:^ |\n-.\n\n更改为^-.\n\n,并添加了m标志,因为行的起始断言^不需要在捕获组中,并且\n会导致删除前面的换行符

该模式也可以修改以匹配任意数量的bl;与图案匹配的线条之间的线条:


这里是一个较短的正则表达式,包括马赫数模式:


常量实际值=原始替换-.*\n\n/g,'$1'

这里是一个较短的正则表达式,包括您的马赫数模式:


常量实际值=原始替换-.*\n\n/g,'$1'

使用多行修改器时非常简单//m

var o rig_str=-line1\n\n\n-line2\n\n-line3\n\n-line4\n\n-line5\n-line6; var new_街= 原始结构替换/^-.\r?\n\s*\r?\n/mg,“1美元”; console.log原始\n---\n+orig\u str+\n;
console.log New\n----\n+New\u str 使用多行修改器时非常简单//m

var orig_str=-line1\n\n\n-line2\n\n-line3\n\n-line4\n\n-line5\n-line6; var new_街= 原始结构替换/^-.\r?\n\s*\r?\n/mg,“1美元”; console.log原始\n---\n+orig\u str+\n;

console.log New\n----\n+New\u str;您匹配-LIL1、空白行和-LIL2以文本捕获这两行;此时,您已使用line2,因此无法再次匹配,这意味着下一个可用于匹配的对象是-line3。。。线2和3之间的空行不是任何匹配的一部分,所以是单独的。请注意/g global不会重新扫描线路;它从最后一次比赛继续。你匹配-LIL1、空白行和-LIL2用文本捕获这两行;此时,您已使用line2,因此无法再次匹配,这意味着下一个可用于匹配的对象是-line3。。。线2和3之间的空行不是任何匹配的一部分,所以是单独的。请注意/g global不会重新扫描线路;它从最后一场比赛中继续。这不能确保空行在一定的范围内。lines@WillBarnwell根据问题,,任何线之间不需要空行,在与特定图形匹配的其他行之间删除空白线,这不能确保空白行在一定的范围内。lines@WillBarnwell根据问题,任何行之间都不需要空行。在与特定图案匹配的其他行之间移动空行。哈哈哈,该死的维克托,你比我快一点@威尔巴恩威尔:是的,但我的解决方案不同。可能效果更好,我知道这是一个答案竞赛,所以我没有测试much@WillBarnwell我刚刚意识到,由于m修饰符的存在,这将不起作用,并删除了注释。同时删除了我的注释,在其他攻击他人正则表达式工作的行为中,你的压缩线没有分离的新线哈哈哈,该死的Wiktor,你比我快一点@威尔巴恩威尔:是的,但我的解决方案不同。可能效果更好,我知道这是一个答案竞赛,所以我没有测试much@WillBarnwell我刚刚意识到,由于m修饰符的存在,这将不起作用,并删除了注释。同时删除了我的注释,在其他攻击他人正则表达式工作的行为中,您的压缩行没有分隔的换行符@WillBarnwell-压缩尾随的换行符对您意味着什么?对不起*removes@WillBarnwell-你可以这样想:。。有2个正方形,一个用来写回线,一个用于空白线。每个方块都以换行符终止。只回写1个正方形。结果是保留了格式。我只是指出这一点,因为OP说的是介于之间而不是之后,如果OP的愿望是消除项目之间的换行符,而完全不考虑其他内容,那么您的正则表达式就不是一个完美的正则表达式answer@WillBarnwell-我想最难的部分是足够聪明地在结尾添加断言^-.*\r?\n\s*\r?\n?=-,但这不是诺贝尔奖的领域,我也不会在一个问题中读到那么多细节@威尔巴恩威尔-压缩尾随的新行对你意味着什么?对不起*removes@WillBarnwell-你可以这样想:。。有2个正方形,一个用来写回线,一个用于空白线。每个方块都以换行符终止。只回写1个正方形。结果是保留了格式。我只是指出这一点,因为OP说的是介于之间而不是之后,如果OP的愿望是消除项目之间的换行符,而完全不考虑其他内容,那么您的正则表达式就不是一个完美的正则表达式answer@WillBarnwell-我想最难的部分是足够聪明地在结尾添加断言^-.*\r?\n\s*\r?\n?=-,但这不是诺贝尔奖的领域,我也不会在一个问题中读到那么多细节。