【问题标题】:JavaScript: how to use a regular expression to remove blank lines from a string?JavaScript:如何使用正则表达式从字符串中删除空行?
【发布时间】:2013-05-04 01:17:03
【问题描述】:

我需要使用 JavaScript 删除 HTML 文本框中的空行。空行可以在textarea 元素中的任何位置。空行可以只是一个回车或空格加回车。

我期待一个正则表达式解决方案。以下是我尝试过的一些方法,但它们不起作用并且无法弄清楚原因:

/^\s*\r?\n/g   

/^\s*\r?\n$/g

编辑 1

看来 aaronman 和 m.buettner 建议的解决方案(我对其进行了一些修改)有效:

string.replace(/^\s*\n/gm, "") 

谁能告诉我为什么我的第一个正则表达式不起作用?

编辑 2

在阅读了所有有用的答案后,我想出了这个:

/^[\s\t]*(\r\n|\n|\r)/gm

这会涵盖所有情况吗?

编辑 3

这是最简洁的一种,涵盖所有空格(空格、制表符)和平台(Linux、Windows、Mac)。

/^\s*[\r\n]/gm

非常感谢 m.buettner!

【问题讨论】:

  • I am expecting a regular expression solution to this. 健康饮食,如果 RegExp 不起作用,请在此处发布
  • 标题中的标签:检查,无代码:检查,错误的态度:检查,讽刺的感谢信息:检查,否决:检查。
  • 即使您是该站点的新手,您也可以在其上搜索诸如正则表达式空行之类的内容。您可以从示例中看到将要回答的内容以及将在地图外投票的内容...例如:stackoverflow.com/questions/3012788/… - 满足您的需求
  • 大家好,我自己尝试了一些正则表达式,但根本无法完成。我用谷歌搜索了它。在谷歌搜索中试试我的标题,告诉我你在哪里得到答案。
  • 对,所以用您尝试过的代码更新您的问题。我们会告诉你你做错了什么。看起来您希望我们为您完成工作的方式

标签: javascript regex blank-line


【解决方案1】:

您的模式似乎没问题,您只需要包含多行修饰符m,以便^$ 也匹配行的开头和结尾:

/^\s*\n/gm

没有m,锚点只匹配字符串的开头和结尾。

请注意,您错过了 UNIX 样式的行尾(仅限 \r)。这在这种情况下会有所帮助:

/^\s*[\r\n]/gm

另请注意,(在这两种情况下)您不需要明确匹配 \n 前面的可选 \r,因为这是由 \s* 处理的。

正如Dex 在评论中指出的那样,如果最后一行仅包含空格(并且后面没有换行符),它将无法清除最后一行。解决这个问题的一种方法是使实际的换行符成为可选的,但在它之前包含一个行尾锚。在这种情况下,您确实必须正确匹配结尾的行:

/^\s*$(?:\r\n?|\n)/gm

【讨论】:

  • m.buettner,非常感谢您指出 Mac 方案。
  • m.buettner,我创建了一个新的 /^[\s\t]*(\r\n|\n|\r)/gm.它会涵盖所有情况吗?
  • @curious1, \s 包括所有空白。即空格、\t、\r 和\n。这就是首先使用 \s 的目的。因此,我们的模式完全相同,是的,它们都涵盖了所有情况。
  • m.buettner,非常感谢详细而清晰的解释。最好的。
  • 如果最后一行是空白的,这将失败,因为没有回车,这可能是最常见的情况。需要一个问号。 /^\s*[\r\n]?/gm
【解决方案2】:

我相信这会奏效

searchText.replace(/(^[ \t]*\n)/gm, "")

【讨论】:

  • 这将不允许\r\n 或换行符前的任何其他空格。
  • 修复了它,他的原始帖子没有说如果一行中有实际空格则为空
  • aaronman,感谢您提供捕获 \t 的附加代码。欣赏!
【解决方案3】:

这里是another solution

string = string.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm, "")

它似乎同时处理空行和仅空格行。

【讨论】:

    【解决方案4】:
    function removeEmptyLine(text) {
      return text.replace(/(\r?\n)\s*\1+/g, '$1');
    }
    

    测试:

    console.assert(removeEmptyLine('a\r\nb') === 'a\r\nb');
    console.assert(removeEmptyLine('a\r\n\r\nb') === 'a\r\nb');
    console.assert(removeEmptyLine('a\r\n \r\nb') === 'a\r\nb');
    console.assert(removeEmptyLine('a\r\n \r\n  \r\nb') === 'a\r\nb');
    console.assert(removeEmptyLine('a\r\n \r\n 2\r\n  \r\nb') === 'a\r\n 2\r\nb');
    console.assert(removeEmptyLine('a\nb') === 'a\nb');
    console.assert(removeEmptyLine('a\n\nb') === 'a\nb');
    console.assert(removeEmptyLine('a\n \nb') === 'a\nb');
    console.assert(removeEmptyLine('a\n \n  \nb') === 'a\nb');
    console.assert(removeEmptyLine('a\n \n2 \n  \nb') === 'a\n2 \nb');
    

    【讨论】:

      【解决方案5】:

      我认为这应该可以解决问题:

      var el = document.getElementsByName("nameOfTextBox")[0];
      el.value.replace(/(\r\n|\n|\r)/gm, "");
      

      编辑:删除三种类型的换行符。

      【讨论】:

      • 他主要是想去掉换行符
      • 啊……我想该睡觉了;)
      • 这将删除所有换行符(不仅仅是空行),m 是多余的。
      • Bjørn Bråthen,感谢您展示了所有三种类型的换行符,这对我来说真的很新鲜。再次感谢!
      • \r\n 通常是 windows,\n linux 和 \r mac 如果我没记错的话。
      猜你喜欢
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 2011-03-22
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多