从字符串的开头和结尾删除换行符

98
我注意到trim()不能删除字符串开头和结尾处的换行符,因此我正在尝试使用以下正则表达式来实现这一点:

我注意到trim()不能删除字符串开头和结尾处的换行符,因此我正在尝试使用以下正则表达式来实现这一点:

return str.replace(/^\s\n+|\s\n+$/g,'');

这并不会去除换行符,我担心我在这方面的能力有限。

编辑 该字符串是使用ejs生成的,如下所示

go = ejs.render(data, { 
    locals: { 
        format() {
            // 
        }
    } 
});

这就是 Go 的样子,只不过前面有几行空白。当我使用 go.trim() 时,仍然会得到前面的换行符。

<?xml version="1.0"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master master-name="Out" page-width="8.5in" page-height="11in" margin-top="1in" margin-bottom="0.5in" margin-left="0.75in" margin-right="0.75in">
            <fo:region-body margin-top="1in" margin-bottom="0.25in"/>
            <fo:region-before extent="1in"/>
            <fo:region-after extent="0.25in"/>
            <fo:region-start extent="0in"/>
            <fo:region-end extent="0in"/>
        </fo:simple-page-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="Out" initial-page-number="1" force-page-count="no-force">
        <fo:static-content flow-name="xsl-region-before">
            <fo:block font-size="14pt" text-align="center">ONLINE APPLICATION FOR SUMMARY ADVICE</fo:block>
            <fo:block font-size="13pt" font-weight="bold" text-align="center">Re:
                SDF, SDF
            </fo:block>

        </fo:static-content>

        <fo:flow flow-name="xsl-region-body" font="10pt Helvetica">

            .. removed this content

        </fo:flow>
    </fo:page-sequence>
</fo:root>

7
你使用哪个trim函数?标准的那个会用。另外,请展示你的字符串,或许里面包含一些奇怪(看不见的)字符。 - Bergi
1
真的吗?Javascript中的trim()不能去除newlines吗?但它应该可以从末尾删除所有的whitespaces,而newline应该是其中之一。\n\s的子元素之一。 - Rohit Jain
1
@elclanrs:换行符包含在\s中。 - Bergi
2
@LeeBlake trim()函数删除了我的字符串末尾的换行符(来自execSync的bash输出),因此他的字符串可能存在一些奇怪的问题。 - Joshua Pinter
只是为了确认一下 - trim() 确实会去除空格、制表符、\n\r等。这在2009年(ES5)被标准化。所以如果你记得它不会去除换行符,你可能和我一样老了。 - undefined
显示剩余3条评论
5个回答

144

13
我将其改为以下答案以解决问题:str.replace(/^\n|\n$/g, ''); - phaberest
1
这也会删除前导空格。 - ya.teck
4
上面的示例有一个错误。应该使用以下代码:str.replace(/(^\s*(?!.+)\n+)|(\n+\s+(?!.+)$)/g, "") - Nordling Art
您的解决方案删除了太多。 - radrow
1
@phaberest,请编写您自己的答案。它应该被接受。 - Dũng Trần Trung
显示剩余2条评论

121
String.trim() 方法确实可以删除换行符(以及其他所有空白字符)。也许以前它不能?但在撰写本文时,它绝对能够。根据相关文档(已加强说明):

trim() 方法从一个字符串的两端删除空格。在此上下文中,空白是指所有空白字符(空格、制表符、不间断空格等)和所有行终止符字符(LF、CR 等)。


如果您想去掉所有换行符以及其他可能存在的空白字符,您可以使用以下方法:

return str.trim();

如果您只想去掉换行符,您可以使用专门针对换行符的解决方案。


1
也许这是IE的问题?看起来 trim 只支持IE 9+,但如果你现在还要支持IE 8,那就只能自求多福了。 ;^D - ruffin
那绝对是有可能的 :) - Ben Kane
1
如果您想要摆脱所有空格,这是可以接受的...但是,如果您只需要摆脱换行符并保留其他空格源,则此方法将失败。 - Spencer O'Reilly
2
@SpencerO'Reilly 这是真的,但问题的目标是除了成功删除的其他空格之外还要删除换行符。仅删除换行符也可能有帮助,但这不是这个问题的答案。 - Ben Kane

5

/^\s+|\s+$/g应该能匹配任何内容。你目前的正则表达式可能存在问题,如果你的换行符包含\r字符,则无法匹配。


1

返回 str.trim().replace(/^\s\n+|\s\n+$/g,'')

如果您像这样使用它,那么我将从开头和结尾的字符串中删除换行符


-4

试试这个:

str.split('\n').join('');

8
我认为这将删除所有换行符,而不仅仅是修剪开头和结尾。 - BeetleJuice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接